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的问题如何解决?
遇到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}'
还有几个要检查的地方:
- 模型定义:检查字段有没有设
nullable=False,如果有,插入null会直接报错。 - 表单或请求数据:用
request.form.get('username')或request.json.get('username')拿到数据后,要检查是不是None。 - 数据库连接和事务:确保数据库连接正常,没有其他错误导致事务回滚。
总结:先检查数据源,确保不是None再创建对象,然后记得commit。
你的 user class 定义呢?
initiailizer 写了么?
啊啊啊!!!忘了,后来改代码把那个注释掉了,昨晚就一直看一直看,就是不知道出在哪里,一语惊醒,太菜了

