2012-04-23 23 views
1

私はPython経由で私のためにいくつかのタスクを行うためにSQLalchemyを取得する作業をしています。Python/SQLalchemy - クエリをトリガする方法は?

私は一種のそれが例に従うことで作業を受けることができますが、私はforループからの問合せの電話を移動するには今しばらく立ち往生されています:テーブルのいずれかを呼び出すことにより、

for instance in session.query(versions_table).filter(versions_table.c.version==Version): 

して結果を取得します結果:

existingID = instance.id 

idが戻ってテーブルのPKである場合)

firiの方法を見つけることです私は何をすることはできませんクエリを自由に実行するか、条件文の結果として実行します。

if some conditions met: 
do query 
get/process result 

私ができる唯一の呼び出しによって返された値を取得instance.fieldname

誰もが私はSQLAlchemyの機能が設定されているかと本当に100%快適ではないだと受け入れて、間違ったつもりどこに私を指すでした/と呼ばれる。

私は何をしたいのラインに沿っている:

for instance in session.query(versions_table).filter(versions_table.c.version==Version): 
if instance.id == True: #this is not correct 
    print instance.id 
else: 
    print "no match" 

充実スクリプト:あなたはクエリを実行してインスタンスを返しますされ、Query.allでクエリを実行することができます

from sqlalchemy import * 
from sqlalchemy.orm import sessionmaker 

engine = create_engine('mysql+mysqldb://u:[email protected]/sqlalchtest', 
        echo=False) 

metadata = MetaData(bind=engine) 
Session = sessionmaker(bind=engine) 
versions_table = Table('versions', metadata, autoload=True) 

def doVersionGet(sigfile_filename): 
tree = etree.parse(sigfile_filename) 
root = tree.getroot() 
attributes = root.attrib 
if 'DateCreated' in root.attrib: 
    DateCreated = (attributes["DateCreated"]) 
if 'Version' in root.attrib: 
    Version = (attributes["Version"]) 
doVersionPush(DateCreated,Version) 

def doVersionPush(DateCreated,Version): 
session = Session() 
for instance in session.query(versions_table).filter(versions_table.c.version==Version): 
    existingID = instance.id 
    #this is not really what I want to do here any way, but this will fire the query every time 

if __name__ == "__main__": 
path = "location\sub_sig_files" ##home_subset for tests 
for (path, dirs, files) in os.walk(path): 
    for file in files: 
    sigfile_filename = str(path)+"\\"+str(file) 
    doVersionGet(sigfile_filename) 
+1

実際に結果を使用していない場合は、なぜクエリを実行する必要がありますか? – Amber

+0

私は単にそれを発射させようとしていて、それを 'for'ループから切り離そうとしています - 私は何かを行うメソッド' instance.fieldname'を見つけたことを示すコードを含めました。 –

+1

さて、言い換えれば、なぜあなたは「欲しいときに発砲する」必要があるのですか? SQLAlchemyは、クエリを遅れて評価します。つまり、実際に結果が出るまで何かを行うまで待っています(結果が実際に必要ない場合は、実行から時間を節約できます最初のクエリ)。 – Amber

答えて

3

instances = session.query(versions_table).filter(versions_table.c.version==Version).all() 
+0

ああ、はい!ありがとうございました。あなたの助けを借りて、そして@アンバーの指摘された質問を私はそれが私が欲しいことをやっている。ありがとうございました。私は本当にあなたの時間を感謝します。 –

関連する問題