Flask sqlalchemy.exc.OperationalError :( OperationalError)尝试使用SQLAlchemy更新数据库时没有这样的表

时间:2018-06-17 00:45:12

标签: python flask flask-sqlalchemy

我是Flask的新手,在设置一个非常基本的Flask应用程序时遇到了一些问题。 现在,我正在尝试让用户在主页上提交表单,然后将该表单保存到SQL数据库中。

但是,当用户提交表单时,我收到以下错误

sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such table: contact [SQL: 'INSERT INTO contact (name, email) VALUES (?, ?)'] [parameters: ('aaa', 'aaa')] (Background on this error at: http://sqlalche.me/e/e3q8)

相关代码如下:

应用程序/ models.py

from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, BooleanField, SubmitField
from wtforms.validators import DataRequired

class ContactForm(FlaskForm):
    name = StringField('Name', validators=[DataRequired()])
    email = PasswordField('Email', validators=[DataRequired()])
    submit = SubmitField('submit')

应用程序/ __init__。PY

from flask import Flask
from config import Config
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
app = Flask(__name__)
app.config.from_object(Config)
db = SQLAlchemy(app)
migrate = Migrate(app, db)
from app import routes, models

应用程序/ config.py

import os
basedir = os.path.abspath(os.path.dirname(__file__))


class Config(object):
    SECRET_KEY = os.environ.get('SECRET_KEY') or 'some-secret-key'
    SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or 'sqlite:///' + os.path.join(basedir, 'app.db')
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    enter code here

我在哪里可能会出错?我必须在某处调用db.create_all()吗?如果是这样,在哪里?

谢谢!

编辑:我也跑

flask db init
flask db migrate
flask db upgrade

3 个答案:

答案 0 :(得分:2)

在models.py中创建模型:

from __init__.py import db

class ContactModel(db.Model):
    __tablename__ = 'contact'

    id = db.Column(db.Integer, primary_key = True)
    name = db.Column(db.String(120))
    email = db.Column(db.String(120))

    def save_to_db(self):
        db.session.add(self)
        db.session.commit()

然后在 init .py:

from flask import Flask
from config import Config
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
app = Flask(__name__)
app.config.from_object(Config)
db = SQLAlchemy(app)
migrate = Migrate(app, db)

#create all db tables
@app.before_first_request
def create_tables():
    from models import ContactModel
    db.create_all()

from app import routes, models

答案 1 :(得分:1)

我有同样的问题。就我而言,我是在forms.py中查询数据库,并将其导入到routes.py

基本上,问题在于在创建数据库之前已在代码中查询了数据库,因为在服务器启动之前加载了类,并且最终发生了初始化。

接受的答案对我不起作用。 不幸的是,我还没有找到一个干净的解决方案。所以我最终找到了解决方法。

在我的情况下,我想在下拉列表中显示文件,因此我第一次将它们初始化为空:

try:
    profile_files = [ (file.path, file.filename[:-4])
                        for file in File.query.filter_by(type=2).order_by(File.created.desc()).all()]
except sqlalchemy.exc.OperationalError as e:
    profile_files = []

所以一般的解决方法是:

try:
    # Your DB query
except sqlalchemy.exc.OperationalError as e:
    # create placeholder until your DB is ready

现在我可以再次使用所有终端命令:

flask db init
flask db migrate
flask db upgrade

希望这对某人有帮助!

答案 2 :(得分:0)

如果您使用的是flask-migrate库,则应运行以下命令来创建和应用迁移。将创建数据库和表。

flask db migrate
flask db upgrade

在运行此命令之前,您应该创建模型。模型对象表示数据库上的表。在您的情况下,它可能看起来像这样

class Contact(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)