sql >> Database teknologi >  >> RDS >> Mysql

SQLAlchemy:Opret sletteforespørgsel ved hjælp af selv-join på MySQL

SQLAlchemy understøtter i øjeblikket UPDATE..FROM på tværs af Postgresql, MySQL og andre, men vi har endnu ikke forsøgt at understøtte DELETE..JOIN.

Det ser dog ud til at virke (næsten?), hvad angår generering af SQL-strengen:

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

udskrifter:

DELETE FROM path JOIN path AS p1 ON p1.ancestor = :ancestor_1 
 WHERE path.descendant = p1.descendant

Men min MySQL-database accepterer ikke dette, som standard gengiver den INNER JOIN, som mislykkes, men hvis jeg ændrer MySQL-kompileren til ikke at gøre dette, mislykkes det stadig :

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,)

ligner din SQL ordret (åh, bortset fra 'slet stier FRA stier'? er det rigtigt?) ?

Under alle omstændigheder, hvis den indbyggede compiler ikke gør det, er dine muligheder at bruge session.execute("some sql") eller for at bygge en brugerdefineret konstruktion med compilerudvidelsen .



  1. Optimer gruppevis maksimal forespørgsel

  2. Sådan opretter du forbindelse til MySQL-databasen

  3. Hvordan opretter man indeks på JSON-feltet i Postgres?

  4. Unik nøgle med NULL