gpt4 book ai didi

python - 与包含的相关对象合并时,新关系不会保留

转载 作者:行者123 更新时间:2023-12-01 08:13:15 29 4
gpt4 key购买 nike

当我尝试更新数据时,我的 SQLAlchemy 模型遇到了一些奇怪的行为。我有一个一对多的关系定义如下:

app = Flask(__name__)
app.config[
"SQLALCHEMY_DATABASE_URI"
] = "postgresql://geonatadmin:monpassachanger@localhost:5432/geonature2db_test"
app.debug = True
DB = SQLAlchemy(app)


class Child(DB.Model):
__tablename__ = "Child"

id_child = DB.Column(DB.Integer, primary_key=True)
id_parent = DB.Column(DB.Integer, ForeignKey("Parent.id_parent"))
name = DB.Column(DB.Unicode(50))


class Parent(DB.Model):
__tablename__ = "Parent"

id_parent = DB.Column(DB.Integer, primary_key=True)
name = DB.Column(DB.Unicode(50))

childrens = relationship("Child", lazy="joined", cascade="all, delete-orphan")

DB.create_all()

我正在尝试从我的 API 发送的 JSON 更新 ParentChild。在我的示例中, parent 已经有一个 child ,我尝试向其中添加两个新 child :

with app.app_context():
first_json = {"name": "parent1", "childrens": [{"name": "john"}]}
childrens = first_json.pop("childrens")
parent = Parent(**first_json)
for child in childrens:
parent.childrens.append(Child(**child))

DB.session.add(parent)
DB.session.commit()
DB.session.flush()

second_json = {
"id_parent": 1,
"name": "parent1",
"childrens": [
{"id_child": 1, "name": "john"},
{"id_child": None, "name": "foo"},
{"id_child": None, "name": "bar"},
],
}
childrens = second_json.pop("childrens")
parent = Parent(**second_json)
for child in childrens:
parent.childrens.append(Child(**child))

DB.session.merge(parent)
DB.session.commit()

最后,我的数据库中只有 Child 1 和 Child 3。子级 2 永远不会被添加。

我尝试获取有关使用此配置发出的实际 SQL 的更多信息:

current_app.config["SQLALCHEMY_ECHO"] = True

事实上,Child 2 没有 INSERT 语句。

最佳答案

我最终发现,如果我在“id_child”为 None 时将其删除,则合并工作正常。 像这样:

second_json = {
"id_parent": 1,
"name": "parent1",
"childrens": [
{"id_child": 1, "name": "john"},
{"name": "foo"},
{"name": "bar"},
],
}

关于python - 与包含的相关对象合并时,新关系不会保留,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55107485/

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