Flask SQLAlchemy不自动更新模型的外键



所以我试图用flask和flask-sqlalchemy与PostgreSQL做一个简单的博客web应用程序。有一个核心目录,它包含init,对python文件进行建模和查看。Models.py如下所示:

from core import db
from sqlalchemy.orm import relationship

class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(20), nullable=False)
surname = db.Column(db.String(20), nullable=False)
nickname = db.Column(db.String(20), unique=True, nullable=False)
email = db.Column(db.String(50), unique=True, nullable=False)
posts = relationship("Post", back_populates="user")

class Post(db.Model):
__tablename__ = 'posts'
id = db.Column(db.Integer, primary_key=True)
date = db.Column(db.Date, nullable=False)
time = db.Column(db.Time, nullable=False)
text = db.Column(db.Text, nullable=False)
user_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False)
user = relationship("User", uselist=False, back_populates="posts")

init.py看起来像这样:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from settings import DB_USER, DB_PASSWORD
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = f"postgresql://{DB_USER}:{DB_PASSWORD}@localhost:5432/test"
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy()
db.init_app(app)
migrate = Migrate(app, db)
from core import views

和views.py是这样的:

from core import app
from core import models

@app.route('/')
def index():
return "Hello world ^_^!!!"

我应用了所有的数据库迁移,创建了'users'和'posts'两个表。然后,我尝试通过flask shell添加一个用户和一个帖子。我运行:

>>> import datetime
>>> u = User(name='Bob', surname='Fisher', nickname='bobby1337', email='whatever@example.com')
>>> p = Post(date=datetime.datetime.now().date(), time=datetime.datetime.now().time(), text="Hello! This is the first post ever!", user_id=u.id)
>>> print(u.id)
None
>>> print (p.id)
None
>>> print(p.user_id)
None
>>> 
>>> print(u.posts)
[]
>>> print(p.user)
None

然后我想,也许我需要提交更改以使一切正常工作,所以我运行:

>>> db.session.add(u)
>>> db.session.add(p)
>>> db.session.commit()

,实际上,u.id和p.id已经设置,但是p.user_id, p.user和u.p posts仍然为空:

>>> print(u.id)
1
>>> print (p.id)
1
>>> print(p.user_id)
None
>>> print(p.user)
None
>>> print(u.posts)
[]
即使模型中设置了nullable=False

,实际数据库中的和user_id字段也是空的。现在,我在这里错过了什么?. 我想,SQLAlchemy应该自动完成这个任务,但是它没有。

直到用户被添加到会话并提交时才分配id。在您的示例中,在将id分配给ForeignKey期间没有指定id,因此关系不起作用。

我建议以下步骤。在这里,用户被分配到文章的关系属性user。在本例中,用户将自动与帖子一起提交。

u = User(
name='Bob', 
surname='Fisher', 
nickname='bobby1337', 
email='whatever@example.com'
)
p = Post(
date=datetime.datetime.now().date(), 
time=datetime.datetime.now().time(), 
text="Hello! This is the first post ever!", 
user=u
)
db.session.add(p)
db.session.commit()