flask - 尝试创建新表时出现操作错误
问题描述
所以,在添加几列之前,我有用户名、密码和电子邮件,它工作正常。但是,当我尝试添加更多内容(例如年龄、性别、电话和地址)时,我收到了这个错误:
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)
另外,这是我的用户类:
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)
我该如何解决这个问题?
解决方案
根据 Dave W. Smith 的建议,该错误可能是由于您没有执行任何数据库迁移操作以使新更改生效。
当数据库模型发生变化时,就像它为您所做的那样,当然必须更新数据库。这就是你想要明显地完成的事情。
因此,您应该注意 SQLAlchemy 的特殊性在于它仅在模型已经存在时才从模型创建表。
这意味着如果您想向数据库添加新内容、修改或删除模型中的字段,您必须销毁旧表并从头开始重新创建所有内容。
所以解决这个问题的解决方案是通过数据库迁移框架。与源代码版本控制工具一样,数据库迁移框架跟踪数据库架构上发生的任何更改。因此它可以对数据库应用增量更改。
对于 SQLAlchemy,有一个优秀的数据库迁移工具,我命名为:Alembic。但是由于您使用 Flask,您不必直接操作 Alembic;有一个 Flask 扩展,可以使用 Alembic 为 Flask 应用程序处理 SQLAlchemy 数据库迁移:flask-migrate
由于你还是 Flask 的初学者,我推荐这个优秀的 Miguel Grinberg 的教程:flask mega tutorial - part-iv :database。它将教您使用 Flask SQLAlchemy 所需的基础知识
推荐阅读
- typescript - 在 TypeScript 中,如何从整数中获取日期?
- firebase - IOS ionic 4 中的 FCM 通知
- dart - Dart - 获取流的最后一个或第一个值
- css - css env() 没有“viewport-fit=cover”
- python - GoogleImageCrawler 错误 - 下载器 - 响应状态代码 404
- c# - 我们如何在将 url 存储到 C# 中的数据库之前对其进行验证?
- angular - 无法在 Angular 12 上导入“@angular/core/src/metadata/ng_module”
- spring - Spring @Transactional 挂起功能
- mongodb - MongoDb C# Client: Aggregation by date (range)
- apache - Apache proxy pass is redirecting instead of acting like a real proxy