python - 烧瓶应用的模型模块
问题描述
我正在构建一个烧瓶应用程序foo
,到目前为止,这就是文件的组织方式
foo
|-- app
| |-- __init__.py
| |-- models.py
|
|-- foo.py
在__init__.py
我定义了一个函数来创建应用程序,然后从foo.py
. 这是__init__.py
这样的:
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
def create_app(config_name):
app = Flask(__name__)
...
db.init_app(app)
该模块models.py
导入db
和访问现有数据库。到目前为止,我一直在使用db.engine.execute(<...>)
进行查询,但它似乎效率低下。例如,我有一个表var
,我经常在我的应用程序中访问它,所以我定义了一个类models.py
class Var(object):
def query ...
但我想alchemy
改用:
class Var(db.Model):
...
我试图按照这里的答案来构建我的应用程序,但这些是我迄今为止发现的问题
如果我
base.metadata.reflect(db.engine)
在create_app
函数中插入,我会收到一个错误,说我需要创建一个上下文,这没有多大意义,因为这是我创建它的地方。当然,如果我这样做,with app.app_context(): base.metadata.reflect(db.engine)
我可以绕过,但是当我创建类时问题仍然存在Var
:类 Var(db.Model): table = db.Model.metadata.tables['var']
字典是空的,所以我得到一个KeyError
.
- 当我尝试在内部创建上下文
models
以创建我的类Var
时,它也会失败,因为它无法导入它。
我已经尝试了所有我发现的建议,但似乎没有一个有效。谢谢你的帮助
解决方案
问题是您使用Flask-SQLAlchemy
它,就像大多数烧瓶扩展一样,与烧瓶绑定,并且为了运行某些任务,它需要烧瓶上下文,但是为了反映已经存在的数据库,您需要一个独立于任何请求的引擎。
您可能仍然可以在需要的任何地方db
使用with app.app_context()
,但最好不要使用Flask-SQLAlchemy
,而是SQLAlchemy
直接使用和使用create_engine
,就像在您链接的问题中一样。
推荐阅读
- elasticsearch - 如何从 ElasticSearch 创建两个级别的 Grafana 变量?
- regex - 用于检测键和值的正则表达式
- vue.js - 如何在 v-for 循环中使用 data-cy
- python - Python - 删除字符串中子字符串的所有出现
- php - Laravel JWT 返回令牌但在后续请求中返回未经身份验证
- node.js - 在托管在 centos7 上的 vagrant 机器上使用 npm install 创建了符号链接,但在从包构建期间遇到问题
- c# - 如何查找目录中 JSON 属性的特定值?
- javascript - 使用节点包版本重命名文件
- python - 在 Python 中加入数据框时修复丢失的数据值
- python - 重新加载 Python 包