【发布时间】:2021-01-26 22:41:15
【问题描述】:
我cameacross several 关于如何在 Flask-SQLAlchemy 中使用 vanilla SQLAlchemy 模型的方法。
在 Flask-SQLAlchemy 中使用继承自 Base 的模型就像一种魅力。
但我真的很喜欢那种方便的东西......
Job.query.all() # Does not work
db.session.query(Job).all() # Works
所以我开始着手处理这个问题并整理了一些代码,但我被困住了,需要一些帮助才能让它变得干净整洁。
以下块是一个通用定义,不继承自其中任何一个。 它是从 Flask-SQLAlchemy 和 vanilla SQLAlchemy 导入并在某些时候使用的。
class VanillaMachine():
__tablename__ = 'machine'
id = Column(Integer, primary_key=True)
name = Column(String(100))
status = Column(Integer)
还有一个工厂接受 db.Model 或 Base 并返回 Machine 和正确的父级:
class MachineFactory:
def __init__(self, *args, **kwargs):
pass
def __new__(cls, *args, **kwargs):
return type('Machine',(object, VanillaMachine, args[0]), VanillaMachine.__dict__.copy())
我很确定该代码有问题,但是 我不确定在哪里。
如果我像这样使用它
db = SQLAlchemy()
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()#
Machine1 = MachineFactory(db.Model)
Machine2 = MachineFactory(Base)
有错误提示
sqlalchemy.exc.ArgumentError: Column object 'id' already assigned to Table 'machine'
可以帮助我以一种好的、可靠的方式解决这个问题吗?
我知道你可以只使用一个函数,将 parent 作为参数传递给 VanillaMachine 并使用一些 if 语句,但这太简单了,对吧? :)
编辑:
我遇到的其他方法是
-
使用 Flask 上下文来使用 Flask-SQLAlchemy 模型
with app.app_context(): pass or app.app_context().push()
但这对我来说太专注于 Flask 并且不允许清楚地分离模型,使它们独立并适应上下文。
- 为
db = SQLAlchemy(app, model_class=Base)提供替代基类,请参阅here。这可能对我有用,但到目前为止我还没有对此进行评估。
【问题讨论】:
标签: python python-3.x sqlalchemy flask-sqlalchemy