2017-10-11 77 views
-1

我有一个包含两个表的数据库。 ssi_processed_files_prod表包含文件信息,包括创建的日期和布尔值,指示数据是否已被删除。 data表包含布尔引用的实际数据。在SQL Alchemy中使用选定的ID

我想ID列表从file_info表年龄为45天以上,从data表中删除相关行,然后从file_info设置布尔True,表示数据已被删除。

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

对于那些想知道答案的人。这是基于阅读基本的SQL炼金术书。鳕鱼的最初块是正确的,但我不得不将结果弄平。从那里我可以使用in_()联合来处理id列表。这使我可以删除相关表中的行并更新anohter中的数据状态。

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)