SQLAlchemy unterstützt derzeit UPDATE..FROM über Postgresql, MySQL und andere, aber wir haben noch nicht versucht, DELETE..JOIN.
zu unterstützenEs scheint jedoch (fast?) zu funktionieren, was die Generierung der SQL-Zeichenfolge betrifft:
class Path(Base):
__tablename__ = "path"
id = Column(Integer, primary_key=True)
descendant = Column(Integer)
ancestor = Column(Integer)
j = join(Path, p1, p1.ancestor == 5)
d = delete(j).where(Path.descendant == p1.descendant)
print d
druckt:
DELETE FROM path JOIN path AS p1 ON p1.ancestor = :ancestor_1
WHERE path.descendant = p1.descendant
Meine MySQL-Datenbank akzeptiert dies jedoch nicht, standardmäßig rendert sie INNER JOIN, was fehlschlägt, aber wenn ich den MySQL-Compiler so ändere, dass dies nicht geschieht, schlägt es immer noch fehl:
s.execute(d)
(ProgrammingError) (1064, "You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the
right syntax to use near 'JOIN path AS p1 ON p1.ancestor = 5 WHERE
path.descendant = p1.descendant' at line 1") 'DELETE FROM path JOIN
path AS p1 ON p1.ancestor = %s WHERE path.descendant = p1.descendant'
(5,)
sieht aus wie Ihr SQL wörtlich (oh, außer 'Pfade aus Pfaden löschen'? ist das richtig?) ?
Wenn der eingebaute Compiler dies nicht tut, haben Sie in jedem Fall die Möglichkeit, session.execute("some sql")
zu verwenden oder um ein benutzerdefiniertes Konstrukt mit der Compiler-Erweiterung
zu erstellen .