gpt4 book ai didi

python - SQLAlchemy - 如何在父级已经持久化时插入连接表继承类实例

转载 作者:行者123 更新时间:2023-12-04 12:04:03 25 4
gpt4 key购买 nike

我使用 SQLAlchemy Joined Table Inheritance 声明了两个类.另外我正在使用 Flask-SQLAlchemy 和 flask 。

class Parent(db.Model):

id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(255))
type = db.Column(db.String(50))

__mapper_args__ = {
'polymorphic_identity': 'parent',
'polymorphic_on': type
}


class Child(Parent):

id = db.Column(db.Integer, db.ForeignKey('parent.id'), primary_key=True)
brand_id = db.Column(db.Integer, nullable=False)

__mapper_args__ = {
'polymorphic_identity': 'child',
}

父子表的关系是 一对一 ,在子端可选出现。

当我创建 Child 的新实例,将其添加到 session 并将其提交到数据库时,一切都按预期工作。 SQLAlchemy 发送一个 INSERT对父表的语句 然后是另一个 INSERT到子表 ,完全独立,避免任何外键约束违规。

在应用程序的某个点,我想在子表中添加一个新行,引用父表中已经存在的行。

当我创建一个新 Child 实例并手动为其分配一个现有的 id 到 FK 列并将其发送到数据库。我收到一个 IntegrityError(重复唯一约束冲突),因为 SQLAlchemy 尝试在数据库中创建一个新的父条目,并将 id 传递给子实例。

所以,真正的问题是:

我如何告诉 Sqlalchemy,父条目已经存在于数据库中,而我只想创建子条目?

最佳答案

您可以通过使用 SQLALchemy Core 直接向子项插入,而不是使用 ORM 添加它来解决此问题。

# where obj is some instance of your parent and session some sqlalchemy session
obj.type = 'child'
session.execute(
sa.insert(Child.__table__).values(id=obj.id, brand_id=...)
)
因为这是在 orm 之外,您现在可能需要从 session 中删除原始父对象,以便 SQLAlchemy ORM session 与您刚刚所做的保持同步。

关于python - SQLAlchemy - 如何在父级已经持久化时插入连接表继承类实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39926937/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com