python - 如何让 Flask-SQLAlchemy 与应用程序工厂模式一起工作
问题描述
我想使用 Flask-SQLAlchemy 建立一个 sqlite 数据库。我收到一个操作错误(sqlite3.OperationalError) no such table
。
这适用于使用烧瓶编写的 Web 应用程序。我想使用 Flask-SQLAlchemy 扩展与数据库交互。我觉得这可能与应用程序上下文有关,但我不确定。
如您所见,该应用程序有一个“模块”(auth
子包)。该模块通过蓝图注册到应用程序。我在子包的文件中定义了Researcher
类的模型。持有应用程序工厂和数据库初始化。因为我只是想让基本功能正常工作,所以我仅有的两个视图定义在.models.py
auth
app/__init__.py
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
应用程序/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
应用程序/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
应用程序/身份验证/初始化.py
from flask import Flask, Blueprint
auth = Blueprint("auth", __name__)
import routes
import models
配置文件
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) no such table: researchers [SQL: u'INSERT INTO researchers (prefix, suffix, phone, phone_ext, orcid) VALUES (?, ?, ?, ?, ?)'] [参数:('Dr.', 'Mr', '08611111', '+353', '0001')] (此错误的背景:http ://sqlalche.me/e/e3q8 )"
解决方案
在代码执行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 - 根据 csv 列替换 xml 值
- angular - 为什么当我到达特定路线时我的对象变成空的?
- database - Cassandra DB 将数据插入多个表
- mysql - 从 localhost 连接到 MySQL 服务器 docker 实例
- r - R中的UNC路径连接
- vba - 使用 VBA 调用 cURL API(带参数)
- automation - 检索虚拟机的更新管理相关详细信息 - AZURE
- python - 在 Python 中,没有显式返回函数如何更改另一个函数中的数据?
- php - 登录重定向后 Laravel 8 重定向但不更改 url (Breeze)
- php - 如何在 Laravel Nova 中显示表情符号