python - 如何让 Flask-SQLAlchemy 与应用程序工厂模式一起工作

标签 python flask sqlalchemy flask-sqlalchemy

我想使用 Flask-SQLAlchemy 建立一个 sqlite 数据库。我收到操作错误 (sqlite3.OperationalError) no such table

这是一个用 flask 编写的 Web 应用程序。我想使用 Flask-SQLAlchemy 扩展与数据库交互。我觉得这可能与应用程序上下文有关,但我不确定。

如您所见,应用程序有一个“模块”(auth 子包)。该模块通过蓝图注册到应用程序。我在 auth 子包的 models.py 文件中定义了 Researcher 类的模型。 app/__init__.py 包含应用程序工厂和数据库初始化。 因为我只是想让基本功能正常工作,所以我仅有的两个 View 是在 app/auth/routes.py 中定义的。


.
|-- app
|   |-- __init__.py
|   |-- auth
|   |   |-- __init__.py
|   |   |-- __pycache__
|   |   |-- models.py
|   |   `-- routes.py
|   |-- static
|   `-- templates
|-- app.db
|-- config.py
|-- instance
|   `-- config.py
`-- run.py

应用/初始化.py

from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
def create_app():
    app = Flask(__name__)
    app.config.from_pyfile("../config.py")

    db.init_app(app)
    with app.app_context():
        db.create_all()

    from app.auth import auth
    app.register_blueprint(auth, url_prefix="/auth/")

    return app 

app/auth/routes.py

from flask import Flask
from app import db
from models import User
from app.auth import auth

@auth.route("/insert")
def insert():
    #r = Reasearcher("Pat","Den", "Pat_Den@mail.com", "operator","Dr.","Mr", "08611111", "+353", "0001")
    u = User(1,"Elija")
    db.session.add(u)
    db.session.commit()

@auth.route("/query")
def query():
    us = users.query.all()
    s = ""
    for u in us:
        s += u.name
    return s

app/auth/models.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from app import db

class User(db.Model):
    __tablename__ = "users"

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

    def __init__(self,ids, name):
        self.id = ids
        self.name = name

app/auth/init.py

from flask import Flask, Blueprint

auth = Blueprint("auth", __name__)

import routes
import models

配置.py

DEBUG = True

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

SQLALCHEMY_DATABASE_URI = "sqlite:////" + os.path.join(BASE_DIR, "app.db")
DATABASE_CONNECT_OPTIONS = {}
THREADS_PER_PAGE = 2

CSRF_ENABLED     = True

CSRF_SESSION_KEY = "secret"
SECRET_KEY = "secret"

我应该能够请求/auth/query 并获取数据库表的内容,但我却收到错误 - “OperationalError: (sqlite3.OperationalError) 没有这样的表:研究人员 [SQL: u'INSERT INTO researchers (prefix, suffix, phone, phone_ext, orcid) VALUES (?, ?, ?, ?, ?)'] [parameters: ( 'Dr.', 'Mr', '08611111', '+353', '0001')](此错误的背景信息位于:http://sqlalche.me/e/e3q8)”

enter image description here

最佳答案

在代码执行 db.create_all() 时,模型尚未导入。导入它们具有填充 SQLAlchemy 在幕后使用的一些数据结构的副作用。如果 db.create_all() 发生在 SQLAlchemy 知道模型之前,它认为没有什么可做的。

试试这个:在 __init__.py 中,删除 with app.appcontext(): db.create_all() 并添加 import models 到底端。然后在run.py中添加管理命令。它看起来像

app = create_app()

@app.cli.command()
def createdb():
    db.create_all()

然后

FLASK_APP=run.py flask createdb

将创建表格。

关于python - 如何让 Flask-SQLAlchemy 与应用程序工厂模式一起工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54487519/

相关文章:

python - 根据另一个时间戳值的月份,对列表元素的值进行分组和求和

python - Azure Flask Web 应用程序中的 Postgres

python - 跨多对多表的关系

python - SQLalchemy 插入 - AttributeError : object has no attribute 'items'

python - 为什么除法四舍五入为整数?

python - 提取十六进制编码字符串的一部分

python - Django静态文件问题

python - Jinja、Flask 和 WTForms : how to pass parameters in field?

python - flask 在网络上渲染opencv图像而不保存文件

python - 当没有这样的命名列时,SQLite 给出找不到列的错误