Je tente d'utiliser un CTE avec un DELETE
dans SQLAlchemy (core). Jusqu'à présent, mes tentatives ont échoué, le CTE n'étant pas inclus dans l'instruction SQL compilée. En fin de compte, cela sera exécuté sur une base de données PostgreSQL, qui supporte ce type d'instruction.SQLAlchemy n'inclut pas de CTE dans DELETE
code Python d'un exemple artificiel:
from sqlalchemy import *
from sqlalchemy.dialects import postgresql
metadata = MetaData()
tbl = Table('foo', metadata,
Column('id', Integer, primary_key = True),
Column('name', String)
)
mycte = select([tbl.c.name]).where(tbl.c.id == 123).cte('ctetbl')
delete_stmt = tbl.delete().where(tbl.c.name == mycte.c.name)
print("Regular:", delete_stmt.compile())
print("Postgres:", delete_stmt.compile(dialect = postgresql.dialect()))
Ce que je me attends est (ou quelque chose comme):
WITH ctetbl AS (
SELECT name FROM foo
WHERE id = 123
)
DELETE FROM foo WHERE foo.name = ctetbl.name
Ce que je veux est:
DELETE FROM foo WHERE foo.name = ctetbl.name
Qu'est-ce qui me manque ici?
question de Raise dans la traqueur? –
Le premier lien est en fait le (très vieux) problème ouvert à ce sujet. –
En ce qui concerne le sous-select scalaire, cela a du sens. Dans mon cas, je choisis plusieurs tables, donc je suppose que mon exemple ne correspond pas exactement à ce que je suis en train de travailler, mais l'extension du compilateur est un pas dans la bonne direction. Content de savoir que c'est une fonctionnalité manquante de SQLAlchemy. J'étais sûr que je n'avais pas manqué quelque chose dans la documentation. Merci beaucoup! – linux2647