bea*_*2Dr 8 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)
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
然而,看起来这样做会将模型与使用flask_sqlalchemy联系起来.我有另一项服务,我想使用这些模型,不要使用烧瓶.有没有办法可以在非Flask特定的上下文中重用这些类定义(可能通过更改db.Model)?
Ser*_*bin 18
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
Run Code Online (Sandbox Code Playgroud)
您可以使用生成的元数据(flaskdb.py)初始化Flask sqlalchemy对象:
from flask_sqlalchemy import SQLAlchemy
from database import metadata
db = SQLAlchemy(metadata=metadata)
Run Code Online (Sandbox Code Playgroud)
你初始化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)
Run Code Online (Sandbox Code Playgroud)
创建的模型可以通过会话在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()
Run Code Online (Sandbox Code Playgroud)
作为这种方法的缺点,您不能通过模型直接访问数据库对象并强制使用会话:
from database import Job
from flaskdb import db
Job.query.all() # Does not work
db.session.query(Job).all() # Works
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2409 次 |
| 最近记录: |