sql >> Database >  >> RDS >> Mysql

SQLAlchemy:maak een verwijderquery met behulp van self-join op MySQL

SQLAlchemy ondersteunt momenteel UPDATE..FROM via Postgresql, MySQL en anderen, maar we hebben tot nu toe nog niet geprobeerd DELETE..JOIN te ondersteunen.

Het lijkt echter (bijna?) te werken voor zover het de SQL-string genereert:

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

afdrukken:

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

Mijn MySQL-database accepteert dit echter niet, standaard wordt INNER JOIN weergegeven, wat mislukt, maar als ik de MySQL-compiler aanpas om dit niet te doen, mislukt het nog steeds:

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

lijkt letterlijk op uw SQL (oh, behalve 'paden verwijderen FROM paden'? klopt dat?) ?

In ieder geval, als de ingebouwde compiler het niet doet, zijn uw opties om session.execute("some sql") te gebruiken. of om een ​​aangepaste constructie te bouwen met de compilerextensie .



  1. Groeperen per week in MySQL

  2. Kan geen rijen zien die zijn ingevoegd door een lopende transactie wanneer het isolatieniveau READ_UNCOMMITTED is

  3. DATEADD-equivalent in PostgreSQL

  4. op zoek naar een kleine variant van GROUP BY