我有一个包含两个表的数据库。 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()
此查询返回正确的结果,但是,我无法有效地处理输出。
答案 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)