sql >> Databasteknik >  >> RDS >> Mysql

SQLAlchemy:Skapa raderingsfråga med självanslutning på MySQL

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 .



  1. SQLite MAX

  2. Hur kan jag bli av med dessa kommentarer i en MySQL-dump?

  3. generera_series() motsvarande i MySQL

  4. Databasautomatisering med Puppet:Implementering av MySQL &MariaDB-replikering