【问题标题】:Avoid retrieving object to delete in many to many rel SQLAlchemy避免在多对多 rel SQLAlchemy 中检索要删除的对象
【发布时间】:2013-04-19 10:38:35
【问题描述】:

有没有办法避免在多对多关系中检索要删除的对象?

assign = Table('manytomany', Base.metadata,
    Column('pid', String(...), ForeignKey('parent.pid')),
    Column('cid', String(...), ForeignKey('child.cid'))
)

class Parent():
    ....
    childs = relationship("Child", secondary = assign, backref = 'parent')

我知道我能做到:

obj = session.query(Table).get(pk_id)
session.delete(obj)

但我希望只有一个数据库访问权限,例如:

session.query(Table).filter_by(id = pk_id).delete()

由于多对多的关系,我得到了一个错误:

'无法删除或更新父行:外键约束失败...'

有可能吗? 非常感谢

【问题讨论】:

    标签: python sqlalchemy many-to-many


    【解决方案1】:

    使用session.query() 将始终首先从数据库中检索对象的数据。为避免这种情况,您必须直接使用与您的 ORM 对象关联的表对象。

    session.execute(Parent.__table__.delete().where(Parent.id==pk_id))
    

    这将向数据库发出一条删除父记录的 DELETE sql 语句。 (Parent.idParent.__table__.c.id 的同义词)

    要解决外键错误,您必须先删除分配表中的记录。

    session.execute(assign.delete().where(assign.c.pid==pk_id))
    

    【讨论】:

    • 外键错误大概也可以通过在childs关系上配置级联来解决。我自己没有这方面的经验,但可以在 here 找到文档。
    • 只是在这个答案中添加一点。上面的 where 子句可以从 sqlalchemy.sql.expression 中获取 and_。所以你可以做where(and_(Parent.id==pk_id, <<some other clause>>)) 并尽可能多地链接它。不过谢谢,这是一个有用的答案。
    猜你喜欢
    • 2012-02-10
    • 1970-01-01
    • 2010-10-18
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    • 2013-03-10
    • 2018-12-27
    • 1970-01-01
    相关资源
    最近更新 更多