我刚刚开始处理 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'
答案 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"