Mysql
 sql >> Datenbank >  >> RDS >> Mysql

SQLAlchemy:Erstellen Sie eine Löschabfrage mit Self-Join in MySQL

SQLAlchemy unterstützt derzeit UPDATE..FROM über Postgresql, MySQL und andere, aber wir haben noch nicht versucht, DELETE..JOIN.

zu unterstützen

Es 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 .