在Flask中使用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)

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_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

您可以使用生成的元数据(flaskdb.py)初始化Flask sqlalchemy对象:

from flask_sqlalchemy import sqlAlchemy

from database import Metadata

db = sqlAlchemy(Metadata=Metadata)

你初始化Flask app就像这样:

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上下文之外使用,例如:

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()

作为这种方法的缺点,您不能通过模型​​直接访问数据库对象并强制使用会话:

from database import Job
from flaskdb import db

Job.query.all() # Does not work
db.session.query(Job).all() # Works
原文链接:https://www.f2er.com/python/185633.html

猜你在找的Python相关文章