Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

SQLAlchemy:Criar consulta de exclusão usando auto-junção no MySQL


SQLAlchemy atualmente suporta UPDATE..FROM em Postgresql, MySQL e outros, mas ainda não tentamos suportar DELETE..JOIN.

No entanto, parece funcionar (quase?), no que diz respeito à geração da string 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

No entanto, meu banco de dados MySQL não está aceitando isso, por padrão ele renderiza INNER JOIN, que falha, mas se eu modificar o compilador MySQL para não fazer isso, ainda falha:
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,)

parece seu SQL literalmente (oh, exceto por 'excluir caminhos de caminhos'? é isso mesmo?) ?

De qualquer forma, se o compilador embutido não estiver fazendo isso, suas opções são usar session.execute("some sql") ou para construir uma construção personalizada com a extensão do compilador .