首页 > 解决方案 > 尝试创建新表时出现操作错误

问题描述

所以,在添加几列之前,我有用户名、密码和电子邮件,它工作正常。但是,当我尝试添加更多内容(例如年龄、性别、电话和地址)时,我收到了这个错误:

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)

我该如何解决这个问题?

标签: flasksqlalchemyflask-sqlalchemyflask-wtforms

解决方案


根据 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 所需的基础知识


推荐阅读