1

我试图在没有运气的情况下在 SQLAlchemy + MySQL 中复制以下查询......

delete paths from paths
join paths as p1 on p1.ancestor = <ID>
where paths.descendant = p1.descendant;

SQLAlchemy 似乎忽略了我放入删除查询的任何连接。我也尝试使用子查询而不是连接,但这在 MySQL 中是不允许的(不能从要删除的同一个表中选择)。任何帮助将非常感激。

更新:是的,我正在尝试使用 ORM 层。这是我尝试过的查询:

p1 = aliased(Path, name="p1")
db.session.query(Path).join(
    p1, p1.ancestor==<ID>
)
.filter(
    Path.descendant==p1.Path.descendant
).delete()

还有子查询变体,但这在 MySQL 上不起作用,所以对我来说没用:

q = db.session.query(Path.descendant).filter(Path.ancestor==<ID>).subquery()
db.session.query(Path).filter(Path.descendant.in_(q)).delete(synchronize_session='fetch')
4

2 回答 2

2

SQLAlchemy 目前支持跨 Postgresql、MySQL 和其他的 UPDATE..FROM,但我们还没有尝试支持 DELETE..JOIN。

但是,就生成 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

印刷:

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

但是,我的 MySQL 数据库不接受这一点,默认情况下它会呈现 INNER JOIN,但会失败,但如果我修改 MySQL 编译器不这样做,仍然会失败:

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

看起来像您的 SQL 逐字记录(哦,除了“从路径中删除路径”之外?对吗?)?

在任何情况下,如果内置编译器没有这样做,您的选择是使用或使用编译器扩展session.execute("some sql")构建自定义构造。

于 2013-02-24T18:29:38.713 回答
2

您可以使用prefixes关键字参数:

j = join(table1, table2, table1.c.key==table2.c.key)
stmt = delete(j, prefixes=[table1_name])
session.execute(stmt)

prefixes关键字只是在语句关键字之后添加一个或多个表达式,即SELECT、INSERT、UPDATE 或DELETE。

在这种情况下,delete(j)语句生成表达式:"DELETE FROM table1 INNER JOIN table2 ON table1.key=table2.key"。当我们添加prefixes参数表达式变为:"DELETE table1 FROM table1 INNER JOIN table2 ON table1.key=table2.key"时,即是正确的 MySQL 查询。

于 2016-01-18T12:12:13.980 回答