python - SQLAlchemy:如何使用连接删除

标签 python mysql sqlalchemy sql-delete

我在使用 SQLAlchemy 做这样的事情时遇到了麻烦:

DELETE a FROM a INNER JOIN b ON b.`aId` = a.`Id` WHERE `b`.`xxx` = ?;

正如这里的帖子:SQLAlchemy: Create delete query using self-join on MySQL

我知道很难在 SQLAlchemy 中使用 join 进行删除。

所以我现在这样做:

session.execute('DELETE a FROM a INNER JOIN b ON b.`aId` = a.`Id` WHERE `b`.`xxx` = %d;'%xxx)

但这让我非常恼火,比如:SQL 注入(inject)问题,等等。

有没有办法用SQLAlchemy解决这里的问题呢?谢谢!

最佳答案

SQLAlchemy 1.2 and up支持multi table deletes对于某些方言(在编写 Postgresql、MySQL 和 Microsoft SQL Server 时):

In [18]: a = table('a', column('x'))

In [19]: b = table('b', column('x'))

In [20]: c = table('c', column('x'), column('y'))

In [21]: a.delete().\
    ...:     where(a.c.x == b.c.x).\
    ...:     where(b.c.x == c.c.x).\
    ...:     where(c.c.y == 1)
Out[21]: <sqlalchemy.sql.dml.Delete object at 0x7f3577d89160>

In [22]: print(_.compile(dialect=mysql.dialect()))
DELETE FROM a USING a, b, c WHERE a.x = b.x AND b.x = c.x AND c.y = %s

同样使用 Session 和 Declarative:

In [2]: class Foo(Base):
   ...:     __tablename__ = 'foo'
   ...:     id = Column(Integer, primary_key=True)

In [3]: class Bar(Base):
   ...:     __tablename__ = 'bar'
   ...:     id = Column(Integer, primary_key=True)
   ...:     foo_id = Column(ForeignKey(Foo.id))
   ...:     

In [4]: class Baz(Base):
   ...:     __tablename__ = 'baz'
   ...:     id = Column(Integer, primary_key=True)
   ...:     bar_id = Column(ForeignKey(Bar.id))
   ...:     val = Column(Integer)
   ...:     

In [5]: session.query(Foo).\
   ...:     filter(Foo.id == Bar.foo_id,
   ...:            Bar.id == Baz.bar_id,
   ...:            Baz.val == 1).\
   ...:     delete(synchronize_session=False)
   ...:            

会发射

DELETE FROM foo USING foo, bar, baz
WHERE foo.id = bar.foo_id AND bar.id = baz.bar_id AND baz.val = %(val_1)s

关于python - SQLAlchemy:如何使用连接删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25395756/

相关文章:

python - 编译器问题: AssertionError on replace( ) given T or F condition with string and column cell

php - 如何用字母在前,符号在后对 MySQL 结果进行排序?

java - 以下sql代码无法插入数据是什么原因?

python - Flask-SqlAlchemy 或 SqlAlchemy 过滤器

python - 使用 SQLAlchemy ORM 高效更新数据库

python - Sqlalchemy 返回 bool 值而不是整数

java - 调号在 Python 中有效,但在 Java 中不行吗?

python - 通过多标签分类应用和绘制数据

python - 对象没有属性 _state

Mysql - 将空值复制到非空表中