我是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
答案 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)