2017-10-11 15 views
-1

私は2つのテーブルを持つデータベースを持っています。 ssi_processed_files_prodテーブルには、作成された日付を含むファイル情報と、データが削除されたかどうかを示すブール値が含まれています。 dataテーブルには、ブール値が参照する実際のデータが格納されています。SQL Alchemyで選択したIDを使って作業する

私は、file_infoテーブルから45日歳以上のIDのリストを取得dataテーブルから関連する行を削除し、そのデータが削除されたことを示すため、Trueにfile_infoからブール値を設定したいです。

file_log_test= Table('ssi_processed_files_prod', metadata, autoload=True, autoload_with=engine) 
stmt = select([file_log_test.columns.id]) 
stmt = stmt.where(func.datediff(text('day'), 
file_log_test.columns.processing_end_time, func.getDate()) > 45) 
connection = engine.connect() 
results = connection.execute(stmt).fetchall() 

このクエリは正しい結果を返しますが、出力を効果的に処理できませんでした。

+0

正常に動作することは何ですか? – univerio

+0

私は上記のクエリのIDの出力を使用して削除と更新操作を行うことができるクエリを作成する方法を理解するのに役立つドキュメントを見つけました。上記のコードは正常に動作します。それは私が問題を抱えている次のステップです。 – Jeff

答えて

0

回答を知りたい方。これは、Essential SQL Alchemyの本を読んだことに基づいています。 codの最初のブロックは正しいものでしたが、結果をリストにまとめる必要がありました。そこから、in_()結合を使用してIDのリストを操作できます。これにより、関連するテーブルから行を削除し、データを更新することができました。

file_log_test= Table('ssi_processed_files_prod', metadata, autoload=True, 
autoload_with=engine) 
stmt = select([file_log_test.columns.id]) 
stmt = stmt.where(func.datediff(text('day'), 
file_log_test.columns.processing_end_time, func.getDate()) > 45) 
connection = engine.connect() 
results = connection.execute(stmt).fetchall() 

ids_to_delete = [x[0] for x in results] 
d = delete(data).where(data.c.filename_id.in_(ids_to_delete)) 
connection.execute(d) 
関連する問題