在Flask中使用SQLAlchemy模型
发布时间:2020-12-16 23:35:46 所属栏目:Python 来源:网络整理
导读:我正在尝试构建可以在Flask和其他非Flask服务中使用的SQLAlchemy模型.我知道为了在Flask中使用这些对象,我可以使用Flask-SQLAlchemy模块并构建如下模型: app_builder.py def create_app(config): # Create a Flask app from the passed in settings app = F
我正在尝试构建可以在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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |