了解为什么对父级的更新不会在子级 sqlalchemy 中更新

时间:2020-12-22 03:36:52

标签: python sqlalchemy flask-sqlalchemy

我刚刚开始处理 SQL 中的关系。有人可以在下面的代码中解释为什么,当我将父母的名字从 Peter 更改为 Charles 时,这并没有更新孩子(Elizabeth)的 parent_name - 即使我已将其更新为 Charles,这仍然是 Peter?

代码如下:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
db = SQLAlchemy(app)

class Parent(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String)
    children = db.relationship("Child", backref="parent")

class Child(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    parent_name = db.Column(db.Integer, db.ForeignKey('parent.name'))

这是控制台:

>>> from database_test import Parent, Child
>>> Peter = Parent(name='Peter')
>>> db.session.add(Peter)
>>> db.session.commit()
>>> Elizabeth = Child(parent=Peter)
>>> Peter.children
[<Child 2>]
>>> db.session.add(Elizabeth)
>>> db.session.commit()
>>> Charles = Parent.query.filter_by(name='Peter').first()
>>> Charles.name = 'Charles'
>>> Elizabeth.parent_name
'Peter'
>>> db.session.commit()
>>> Elizabeth.parent_name
'Peter'
>>> Sam.name
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'Sam' is not defined
>>> Peter.name
'Charles'

1 个答案:

答案 0 :(得分:1)

首先,Child 中的外键应该是 parent_id,而不是 parent_name,因为 Parent.id 是主键。如果您希望从 Parent.name 对象直接访问 Child,您也可以在那里添加关系,例如

class Parent(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String)
    children = db.relationship("Child", back_populates="parent")


class Child(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String)
    parent_id = db.Column(db.Integer, db.ForeignKey('parent.id'))
    parent = db.relationship("Parent", back_populates="children")


parent1 = Parent(name="Peter")
child1 = Child(name="Elizabeth", parent=parent1)
print(child1.name)  # Elizabeth
print(child1.parent.name)  # "Peter"

然后,如果您更改 parent1 的名称,则更改将反映在 child1 中:

parent1.name = "Charles"
print(child1.parent.name)  # "Charles"
相关问题