sql >> Base de Datos >  >> RDS >> Mysql

SQLAlchemy:cree una consulta de eliminación utilizando la autounión en MySQL

SQLAlchemy actualmente es compatible con UPDATE..FROM en Postgresql, MySQL y otros, pero hasta ahora no hemos intentado admitir DELETE..JOIN.

Sin embargo, parece funcionar (¿casi?), en cuanto a generar la cadena 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

Sin embargo, mi base de datos MySQL no acepta esto, por defecto muestra INNER JOIN, lo que falla, pero si modifico el compilador MySQL para que no haga esto, sigue fallando:

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

se parece a su SQL palabra por palabra (oh, excepto por 'eliminar rutas DESDE rutas'? ¿Es eso correcto?) ?

En cualquier caso, si el compilador incorporado no lo está haciendo, sus opciones son usar session.execute("some sql") o para crear una construcción personalizada con la extensión del compilador .