python - 在 Flask 内外使用 SQLAlchemy 模型

标签 python sqlalchemy flask-sqlalchemy

我正在尝试构建可用于 Flask 和其他非 Flask 服务的 SQLAlchemy 模型。我知道为了在 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)

数据库.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 的情况下使用这些模型。有没有办法可以在非 Flask 特定的上下文中重用这些类定义(可能通过更改 db.Model)?

最佳答案

flask_sqlalchemy不允许您在 Flask 之外使用它语境。但是,您可以通过 SQLAlchemy 创建模型本身。所以你的database.py文件看起来像这样:

from sqlalchemy import MetaData, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base

metadata = MetaData()
Base = declarative_base(metadata=metadata)

class Job(Base):
    __tablename__ = 'job'
    
    job_id = Column(Integer, primary_key=True)
    description = Column(String(256))
    
    def __init__(self, description):
        self.description = description
你可以初始化一个 flask_sqlalchemy使用生成的元数据 (flaskdb.py) 的对象:
from flask_sqlalchemy import SQLAlchemy

from database import metadata

db = SQLAlchemy(metadata=metadata)
你初始化你的Flask像这样的应用程序:
from flask import Flask

from flaskdb import db

def create_app(config):
    app = Flask('web_service')
    app.config.from_object(config)
    
    db.init_app(app)
创建的模型可以在 Flask 之外使用上下文通过 Session .例如:
from sqlalchemy import create_engine
from sqlalchemy.orm import Session

from database import metadata, Job

engine = create_engine('your://database@configuration/here')
session = Session(engine)
jobs = session.query(Job).all()
session.close()
作为这种方法的一个缺点,您不能通过模型​​直接访问数据库对象。相反,您被迫使用 Session年代:
from database import Job
from flaskdb import db

Job.query.all() # Does not work
db.session.query(Job).all() # Works

关于python - 在 Flask 内外使用 SQLAlchemy 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41004540/

相关文章:

c# - 抓取基于登录的网站的最佳方式是什么?

python - 使用蓝图时 Flask Sqlalchemy 循环导入

python - 在向其中插入新数据时是否可以转储/复制 PostgreSQL 表?

python - Flask-Admin:可以搜索 hybrid_property 吗?

python - 我可以避免在 Flask 和 SQLAlchemy 中循环导入吗

python - 从具有 DenseVector 行的 pyspark 数据框中获取行的最大值

python - pyOCR 没有可用的工具

Google App Engine 的 Python API 问题

sqlalchemy - 双重多态继承问题

python - 在 SQLAlchemy 中通过 association_proxy 分配一组新的多对多相关标签的最优雅的方法是什么?