2017-10-11 3 views
-1

J'ai une base de données avec deux tables. La table ssi_processed_files_prod contient des informations sur le fichier, y compris la date de création et un booléen indiquant si les données ont été supprimées. La table data contient les données réelles les références booléennes.Utilisation des ID sélectionnés dans l'alchimie SQL

Je veux obtenir une liste des ID âgés de plus de 45 jours à compter de la table file_info, supprimer les lignes associées de la table data, puis définissez le booléen de file_info True pour indiquer que les données ont été supprimées.

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

Cette requête renvoie les résultats corrects, cependant, je n'ai pas été en mesure de travailler efficacement avec la sortie.

+0

Que signifie le fait de travailler correctement? – univerio

+0

Mieux dit j'ai trouvé la documentation pour m'aider à comprendre comment créer une requête qui peut utiliser la sortie de l'ID de la requête ci-dessus pour faire l'opération de suppression et de mise à jour. Le code ci-dessus fonctionne bien. Ce sont les prochaines étapes avec lesquelles j'ai des problèmes. – Jeff

Répondre

0

Pour ceux qui voudraient connaître la réponse. Cela était basé sur la lecture du livre Essential SQL Alchemy. Le bloc initial de morue était correct, mais j'ai dû aplatir les résultats dans une liste. De là, je pourrais utiliser la conjugaison in_() pour travailler avec la liste des identifiants. Cela m'a permis de supprimer des lignes de la table correspondante et de mettre à jour l'état des données dans 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)