Python中Flask数据库提交一直为null的问题如何解决?

照着 flask web 那本书敲得代码,之前用户注册一直正常,可以正常生成数据
后来一直接着写,结果今晚测试的时候,发现数据提交到数据库的时候一直为 null

代码

最后把
user=User(email=form.email.data,username=form.username.data,password=form.password.data)
分开写成
user=User()
user.email=form.email.data
user.username=form.username.data
user.password=form.password.data
就写入成功了
求解为什么会出现这样的问题
Python中Flask数据库提交一直为null的问题如何解决?


3 回复

遇到Flask里数据库提交后数据还是null的情况,通常是因为SQLAlchemy的session管理或者事务没处理好。最常见的问题是在修改了模型实例的属性后,没有调用db.session.commit(),或者代码逻辑里在提交前数据就被覆盖了。

给你个完整的例子看看。假设你有个简单的用户模型:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

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

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), nullable=False)

# 创建表
with app.app_context():
    db.create_all()

问题往往出在视图函数里。下面这个是错误的写法,提交后username会是null:

@app.route('/add_user_bad')
def add_user_bad():
    user = User(username=None)  # 这里显式给了None
    db.session.add(user)
    db.session.commit()
    # 提交后数据库里username就是NULL
    return f'User id: {user.id}'

更常见的坑是忘记提交,或者在提交前覆盖了数据

@app.route('/add_user_forgot_commit')
def add_user_forgot_commit():
    user = User(username='test')
    db.session.add(user)
    # 漏了 db.session.commit() !!!
    # 数据不会保存到数据库
    return '看起来加了,其实没提交'

@app.route('/add_user_overwrite')
def add_user_overwrite():
    user = User(username='original')
    db.session.add(user)
    user.username = None  # 提交前被覆盖成None了
    db.session.commit()
    # 数据库里存的是None
    return '提交前数据被改了'

正确的做法是确保数据在添加前就是正确的,并且一定要提交:

@app.route('/add_user_correct')
def add_user_correct():
    # 1. 确保构造时数据有效
    username = request.args.get('username')
    if not username:
        return 'Username is required', 400
        
    user = User(username=username)
    db.session.add(user)
    
    # 2. 必须调用commit
    db.session.commit()
    
    # 3. 提交后可以访问自动生成的id等属性
    return f'User {user.username} added with id {user.id}'

还有几个要检查的地方:

  1. 模型定义:检查字段有没有设nullable=False,如果有,插入null会直接报错。
  2. 表单或请求数据:用request.form.get('username')request.json.get('username')拿到数据后,要检查是不是None。
  3. 数据库连接和事务:确保数据库连接正常,没有其他错误导致事务回滚。

总结:先检查数据源,确保不是None再创建对象,然后记得commit。


你的 user class 定义呢?
initiailizer 写了么?

啊啊啊!!!忘了,后来改代码把那个注释掉了,昨晚就一直看一直看,就是不知道出在哪里,一语惊醒,太菜了

回到顶部