2017-10-11 3 views
-1

Ich habe eine Datenbank mit zwei Tabellen. Die Tabelle ssi_processed_files_prod enthält Dateiinformationen einschließlich des Erstellungsdatums und einen Booleschen Wert, der angibt, ob die Daten gelöscht wurden. Die Tabelle data enthält die tatsächlichen Daten, auf die die Booleschen Referenzen verweisen.Mit ausgewählten IDs in SQL Alchemy arbeiten

Ich mag aus der file_info Tabelle enthält eine Liste von IDs im Alter von 45 Tagen erhalten, löschen Sie die zugehörigen Zeilen aus der data Tabelle und dann den boolean von file_info auf True die Daten, um anzuzeigen, werden gelöscht.

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() 

Diese Abfrage gibt die richtigen Ergebnisse zurück, jedoch konnte ich nicht effektiv mit der Ausgabe arbeiten.

+0

Was bedeutet korrekt arbeiten? – univerio

+0

Besser gesagt, ich habe eine Dokumentation gefunden, die mir hilft zu verstehen, wie man eine Abfrage erstellt, die die Ausgabe von IDs aus der obigen Abfrage verwendet, um den Lösch- und Aktualisierungsvorgang auszuführen. Der obige Code funktioniert einwandfrei. Es sind die nächsten Schritte, mit denen ich Probleme habe. – Jeff

Antwort

0

Für diejenigen, die die Antwort wissen möchten. Dies basiert auf dem Lesen des Essential SQL Alchemy Buches. Der erste Block Kabeljau war korrekt, aber ich musste die Ergebnisse in eine Liste verflachen. Von dort konnte ich die in_() - Verknüpfung verwenden, um mit der Liste der IDs zu arbeiten. Dies erlaubte mir, Zeilen aus der relevanten Tabelle zu löschen und den Datenstatus in einem anderen zu aktualisieren.

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)