SQLAlchemy stöder för närvarande UPDATE..FROM över Postgresql, MySQL och andra, men vi har ännu inte försökt stödja DELETE..JOIN.
Det verkar dock fungera (nästan?), så långt som att generera SQL-strängen:
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
utskrifter:
DELETE FROM path JOIN path AS p1 ON p1.ancestor = :ancestor_1
WHERE path.descendant = p1.descendant
Min MySQL-databas accepterar dock inte detta, som standard återger den INNER JOIN, som misslyckas, men om jag modifierar MySQL-kompilatorn så att den inte gör detta, misslyckas den fortfarande :
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,)
ser ut som din SQL ordagrant (åh, förutom 'radera sökvägar FRÅN sökvägar'? är det rätt?) ?
I vilket fall som helst, om den inbyggda kompilatorn inte gör det, är dina alternativ att använda session.execute("some sql")
eller för att bygga en anpassad konstruktion med kompilatortillägget
.