SQLAlchemy в момента поддържа UPDATE..FROM в Postgresql, MySQL и други, но все още не сме се опитвали да поддържаме DELETE..JOIN.
Въпреки това изглежда работи (почти?), що се отнася до генерирането на SQL низ:
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
отпечатва:
DELETE FROM path JOIN path AS p1 ON p1.ancestor = :ancestor_1
WHERE path.descendant = p1.descendant
Въпреки това, моята MySQL база данни не приема това, по подразбиране тя изобразява INNER JOIN, което се проваля, но ако модифицирам компилатора на MySQL да не прави това, пак не успява:
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,)
изглежда като вашия SQL дословно (о, с изключение на „изтриване на пътища ОТ пътеки“? така ли е?) ?
Във всеки случай, ако вграденият компилатор не го прави, вашите опции са да използвате session.execute("some sql")
или да създадете персонализирана конструкция с разширението на компилатора
.