2017-09-22 3 views
-1

En regardant cette réponse dans stackoverflow (https://stackoverflow.com/a/578926/3152204), je suis très curieux de voir comment cette requête est effectuée dans sqlalchemy.Comment effectuer une sous-requête de suppression dans SQL Alchemy?

DELETE FROM `table` 
WHERE id NOT IN (
    SELECT id 
    FROM (
    SELECT id 
    FROM `table` 
    ORDER BY id DESC 
    LIMIT 42 -- keep this many records 
) foo 
); 
+0

ceci est une requête bizarre, quel est le point de cela, 'SELECT id DE ( id SELECT FROM table ORDER BY id DESC LIMIT 42'. –

+0

@aws_apprentice D'après la réponse dont j'ai parlé , la réponse de l'utilisateur a indiqué qu'il y a deux erreurs qui se produiraient s'il n'y a aucune sous-requête intermédiaire – EndenDragon

+0

cette réponse est de 09, sûrement quelque chose a changé, non? –

Répondre

0

Voici une façon de le faire.

from sqlalchemy.sql import select 


#no need to keep the whole table here 
ids_to_keep = select([table.c.id, table.c.timestamp]).order_by(table.c.timestamp.desc()).limit(42) 

#execute the final query 
connection.execute(table.delete().where(table.c.id != ids_to_keep.c.id)).fetchall() 
+0

Cela va se compiler à 'DELETE FROM tbl WHERE tbl.id! = id', ce qui supprimera exactement 0 lignes, sauf si id est NaN. Vous vouliez faire 'ids_to_keep = select ([table.c.id]). Order_by (table.c.timestamp.desc()) .limit (42)' et ensuite 'table.delete(). Où (table.c .id.notin_ (ids_to_keep)). –