Mysql
 sql >> Base de données >  >> RDS >> Mysql

SQLAlchemy :créer une requête de suppression à l'aide de l'auto-jointure sur MySQL

SQLAlchemy prend actuellement en charge UPDATE..FROM sur Postgresql, MySQL et autres, mais nous n'avons pas encore essayé de prendre en charge DELETE..JOIN.

Cependant, cela semble fonctionner (presque ?), en ce qui concerne la génération de la chaîne 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

imprime :

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

Cependant, ma base de données MySQL n'accepte pas cela, par défaut, elle affiche INNER JOIN, qui échoue, mais si je modifie le compilateur MySQL pour ne pas le faire, cela échoue toujours :

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

ressemble à votre SQL mot pour mot (oh, sauf pour 'supprimer les chemins des chemins' ? c'est bien ça ?) ?

Dans tous les cas, si le compilateur intégré ne le fait pas, vos options sont d'utiliser session.execute("some sql") ou pour créer une construction personnalisée avec l'extension de compilateur .