【问题标题】:Operational error when I tried to create new tables尝试创建新表时出现操作错误
【发布时间】:2019-04-22 11:07:44
【问题描述】:

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

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)

我该如何解决这个问题?

【问题讨论】:

  • 当您说“添加的东西”时,您的意思是向User 模型添加了字段吗?你有没有做任何事情来迁移底层数据库以便包含相应的新列?
  • @DaveW.Smith 我是烧瓶和 sql 的新手。所以,是的,我确实向 User 模型添加了字段,但我并没有完全得到下一个语句。 “迁移”到数据库是什么意思?

标签: flask sqlalchemy flask-sqlalchemy flask-wtforms


【解决方案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 所需的基础知识

【讨论】:

  • 如果您是 Flask 新手,建议您阅读 Flask Mega 教程。
猜你喜欢
  • 1970-01-01
  • 2015-01-15
  • 2016-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多