【发布时间】:2021-02-02 18:38:59
【问题描述】:
使用flask-sqlalchemy,如何从redis 任务中连接到数据库?
数据库连接在create_app 中创建,其中:
db = SQLAlchemy(app)
我从路由中调用作业:
@app.route("/record_occurrences")
def query_library():
job = queue.enqueue(ApiQueryService(word), word)
然后在redis任务里面,我要更新数据库
class ApiQueryService(object):
def __init__(self,word):
resp = call_api()
db.session.query(Model).filter_by(id=word.id).update({"count":resp[1]})
我找不到访问数据库的方法。我试过用from app import db 导入它。我尝试将其存储在g 中。我尝试用SQLAlchemy(app) 和其他一些东西重新实例化它,但这些都不起作用。当我使用 sqlite 时,所有这些都有效,我可以使用简单称为 sqlite3.connect() 的 get_db 方法轻松地从任何模块连接到数据库。是否有一些简单的方法可以使用类似的 SQLAlchemy 访问它?
【问题讨论】:
-
你试过
from flask import current_app; current_app.db吗? Flask 会自动尝试从全局上下文中定位应用程序。你可以read more here -
是的,我确实尝试过。我用
from flask import current_app导入。但是,调用current_app会引发Working outside of application context.错误。所以我试图把它放在app.app_context中,但是我得到一个错误,app是未定义的。导入app然后会产生循环导入错误。 -
在 rq 任务中调用
db = SQLAlchemy()时有没有办法直接将SQLALCHEMY_DATABASE_URI传递给它? -
您通常可以通过在没有与
db = SQLAlchemy()关联的应用程序的情况下在任务脚本中实例化实际的db对象来解决循环导入问题,然后在您的工厂函数中导入该db,调用db.init_app(app)。多次声明连接字符串是一种反模式,最好找出根本原因。 -
如何访问
db.init_app(app)中的app变量?当我将from app import app添加到任务文件时,我得到cannot import name 'app' from partially initialized module。
标签: python-3.x database import sqlalchemy flask-sqlalchemy