Python 在烧瓶内外使用SQLAlchemy模型

Python 在烧瓶内外使用SQLAlchemy模型,python,sqlalchemy,flask-sqlalchemy,Python,Sqlalchemy,Flask Sqlalchemy,我正在尝试构建SQLAlchemy模型,这些模型可以在Flask和其他非Flask服务中使用。我知道为了在Flask中使用这些对象,我可以使用Flask SQLAlchemy模块构建如下模型: app_builder.py def create_app(config): # Create a Flask app from the passed in settings app = Flask('web_service') app.config.from_object(co

我正在尝试构建SQLAlchemy模型,这些模型可以在Flask和其他非Flask服务中使用。我知道为了在Flask中使用这些对象,我可以使用Flask SQLAlchemy模块构建如下模型:

app_builder.py

def create_app(config):

    # Create a Flask app from the passed in settings
    app = Flask('web_service')
    app.config.from_object(config)

    # Attach SQLAlchemy to the application
    from database import db

    db.init_app(app)
database.py

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class Job(db.Model):
    __tablename__ = 'job'

    job_id = db.Column(db.Integer, primary_key=True)
    description = db.Column(db.String(256))

    def __init__(self, description):
        self.description = description

然而,这样做似乎将模型与使用flask_sqlalchemy联系在一起。我有另一项服务,我想在不使用烧瓶的情况下使用这些型号。有没有一种方法可以在非Flask特定的上下文中重用这些类定义(可能通过更改db.Model)?

Flask\u sqlalchemy不允许在Flask上下文之外使用它。但是,您可以通过SQLAlchemy本身创建模型。因此,您的database.py文件如下所示:

从sqlalchemy导入元数据、列、整数、字符串
从sqlalchemy.ext.declarative导入声明性基础
元数据=元数据()
Base=声明性_Base(元数据=元数据)
班级作业(基本):
__tablename_uu='job'
作业id=列(整数,主键=真)
description=列(字符串(256))
定义初始化(自我,描述):
self.description=描述
您可以使用生成的元数据(flaskdb.py)初始化Flask sqlalchemy对象:

从flask\u sqlalchemy导入sqlalchemy
从数据库导入元数据
db=SQLAlchemy(元数据=元数据)
您可以这样初始化Flask应用程序:

从烧瓶导入烧瓶
从flaskdb导入数据库
def创建应用程序(配置):
app=Flask(“网络服务”)
app.config.from_对象(config)
db.init_应用程序(应用程序)
创建的模型可通过会话在烧瓶上下文之外使用,例如:

从sqlalchemy导入创建引擎
从sqlalchemy.orm导入会话
从数据库导入元数据,作业
引擎=创建引擎('your://database@配置/此处')
会话=会话(引擎)
jobs=session.query(作业).all()
session.close()
这种方法的一个缺点是,您不能通过模型直接访问数据库对象,也不能强制使用会话:

从数据库导入作业
从flaskdb导入数据库
Job.query.all()不起作用
db.session.query(Job.all()#有效

这完美地解决了我的问题。非常感谢你!上一个示例中的小提示:我必须使用类似于
db.session.query(Job.all()
的东西进行查询,但这在我的其余设置中非常有用,谢谢!我找到了一个很好的解决方案: