因此,在添加一些列之前,我有用户名,密码和电子邮件,并且运行正常。但是,当我尝试添加一些其他信息(例如年龄,性别,电话和地址)时,出现此错误:
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such table: user [SQL: 'SELECT user.id AS user_id, user.username AS user_username, user.email AS user_email, user.password AS user_password, user.age AS user_age, user.gender AS user_gender, user.phone AS user_phone, user.address AS user_address \nFROM user \nWHERE user.username = ?\n LIMIT ? OFFSET ?'] [parameters: ('agam-kashyap', 1, 0)] (Background on this error at: http://sqlalche.me/e/e3q8)
错误似乎出在以下几行:
@app.route("/register",methods = ['GET','POST'])
def register():
form = RegistrationForm()
if form.validate_on_submit():
user = User(username=form.username.data, email = form.email.data, password = form.password.data, age = form.age.data, gender = form.gender.data, phone = form.phone.data, address = form.address.data)
db.create_all()
db.session.add(user)
db.session.commit()
return redirect(url_for('login'))
return render_template('register.html', title= 'Register' , form = form)
另外,这是我的User类:
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(20), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
password = db.Column(db.String(60), nullable=False)
age = db.Column(db.String(3), nullable=False)
gender = db.Column(db.String(6), nullable=False)
phone = db.Column(db.String(10), nullable=False)
address = db.Column(db.String(200), nullable=False)
我该如何解决这个问题?
答案 0 :(得分:1)
与Dave W. Smith的建议一致,该错误可能是由于您没有执行任何数据库迁移操作以使新更改生效而导致的。
当数据库模型发生更改时(如您所愿),当然必须更新数据库。这是您要明显完成的任务。
因此,您应该注意,SQLAlchemy的特殊之处在于,它仅在模型已经存在的情况下才从模型创建表。
这意味着,如果要向数据库中添加新内容,修改或删除模型中的字段,必须销毁旧表并从头开始重新创建所有内容。
因此,解决此问题的解决方案是通过数据库迁移框架。像源代码版本控制工具一样,数据库迁移框架可跟踪数据库模式上发生的所有更改。因此,它可以将增量更改应用于数据库。
对于SQLAlchemy,有一个出色的数据库迁移工具,我命名为:Alembic。但是,由于使用了Flask,因此不必直接操作Alembic。有一个Flask扩展可以使用Alembic处理Flask应用程序的SQLAlchemy数据库迁移:flask-migrate
由于您仍然是Flask的初学者,因此我推荐这篇出色的Miguel Grinberg的教程:the flask mega tutorial - part-iv :database。它将教您使用Flask SQLAlchemy所需的基础知识