当前位置: 首页 > 面试题库 >

SQLAlchemy删除不级联

公羊喜
2023-03-14
问题内容

我的User模型与模型有关系Address。我已指定该关系应级联删除操作。但是,当我查询和删除用户时,出现一个错误,指出仍在引用地址行。如何删除用户和地址?

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    addresses = db.relationship('Address', cascade='all,delete', backref='user')

class Address(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey(User.id))



db.session.query(User).filter(User.my_id==1).delete()



IntegrityError: (IntegrityError) update or delete on table "user" violates foreign key constraint "addresses_user_id_fkey" on table "address"
DETAIL:  Key (my_id)=(1) is still referenced from table "address".
 'DELETE FROM "user" WHERE "user".id = %(id_1)s' {'id_1': 1}

问题答案:

你有以下…

db.session.query(User).filter(User.my_id==1).delete()

请注意,在“过滤器”之后,您仍然返回Query对象。因此,当您调用时delete(),您正在调用delete()Query对象(而不是User对象)。这意味着您正在执行批量删除(尽管可能只删除了一行)

您正在使用的Query.delete()方法的文档说…

该方法不提供Python中的级联关系-假定ON DELETE CASCADE / SET NULL /
etc。为需要它的任何外键引用配置了,否则如果强制执行外键引用,数据库可能会发出完整性冲突。

就像说的那样,以这种方式运行delete将忽略您设置的Python级联规则。您可能想做类似的事情。

user = db.session.query(User).filter(User.my_id==1).first()
db.session.delete(user)

否则,您可能还希望考虑为数据库设置级联。



 类似资料:
  • 问题内容: 我必须缺少SQLAlchemy的层叠选项的琐碎内容,因为我无法获得简单的层叠删除来正确操作-如果删除了父元素,则子对象将使用外键保留。 我在这里放了一个简洁的测试用例: 输出: 父母与子女之间存在简单的一对多关系。该脚本创建一个父级,添加3个子级,然后提交。接下来,它删除父级,但子级仍然存在。为什么?如何使孩子级联删除? 问题答案: 问题是sqlalchemy认为是父级的,因为这是您定

  • 问题内容: 我正在开发使用sqlalchemy 0.6的现有应用程序的扩展。 该应用程序具有以非声明方式创建的sqlalchemy表。我正在尝试在扩展程序中创建一个新表,该表的外键列指向应用程序数据库中主表的主键,并且以声明方式创建它。 这一切都很好,加载扩展程序后就创建了表,一点也没有抱怨。我的表将打印出来,并演示已经添加了新行。我想要并认为可能的(但不知道,因为我从未使用过sql或任何其他数据

  • 编辑:修改问题以更好地反映问题。此处最初发布的问题 我有一个父实体(< code >上下文)和一个子实体(< code >用户)。父级上的级联“删除”不会删除子级。代码如下:

  • 问题内容: 我试图做一个函数来删除我的数据库中带有flask和SQLAlchemy扩展名的记录。问题是,它不仅删除了所有行,而且还删除了所有行。有人可以告诉我我的代码有什么问题吗? 提前致谢! 问题答案: 我怀疑这条线与你的想法不符。 你将获得一个实例(你之前已经做过),并且通过使用它实际上对所有对象发出了一个新查询,而不进行过滤,因此删除了所有对象。 你可能想做的是:

  • 问题内容: 我试图使用没有结果的过滤查询删除一些子行: 我得到了错误。 全栈跟踪: 我无法找到问题所在。 任何想法? 问候 问题答案: 在查找您的异常发生的源之后,我建议尝试以下操作: 请参阅delete方法的文档以了解其含义。传递参数将基本上运行查询两次,一次为选择,一次为删除。 如果运行两个查询是不希望的,通过代替,然后调用立即删除后,以避免不一致的状态的内部存储。

  • 我有两个实体使用Spring和Hibernate