sql >> Databáze >  >> RDS >> Mysql

SQLAlchemy:Vytvořte odstraňovací dotaz pomocí self-join na MySQL

SQLAlchemy aktuálně podporuje UPDATE..FROM napříč Postgresql, MySQL a dalšími, ale zatím jsme nezkoušeli podporovat DELETE..JOIN.

Zdá se však, že to funguje (téměř?), pokud jde o generování řetězce 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

tiskne:

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

Moje databáze MySQL to však neakceptuje, ve výchozím nastavení vykresluje INNER JOIN, což se nezdaří, ale pokud upravím kompilátor MySQL tak, aby to nedělal, stále selže:

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

vypadá to jako vaše doslovné SQL (ok, kromě 'smazat cesty z cest'? je to tak?)?

V každém případě, pokud to vestavěný kompilátor nedělá, vaše možnosti jsou použít session.execute("some sql") nebo vytvořit vlastní konstrukci pomocí rozšíření kompilátoru .



  1. aktivace účtu php/mysql

  2. Přesouvání souborů mysql mezi servery

  3. SQL - Vyberte řádky ze dvou různých tabulek

  4. Spusťte SQL z dávkového souboru