在SQL Alchemy中使用选定的ID

时间:2017-10-11 15:02:25

标签: python sqlalchemy

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

我想从file_info表中获取45天以内的ID列表,从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()

此查询返回正确的结果,但是,我无法有效地处理输出。

1 个答案:

答案 0 :(得分:0)

对于那些想知道答案的人。这是基于阅读Essential SQL Alchemy一书。最初的鳕鱼​​块是正确的,但我不得不将结果压平成一个清单。从那里我可以使用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)