如何解决在香草SQLAlchemy和Flask-SQLAlchemy中使用相同模型的方法?

遇到 几种有关如何在Flask-SQLAlchemy中使用香草SQLAlchemy模型的方法。

使用从BaseFlask-SQLAlchemy继承的模型就像一种魅力

但是我真的很喜欢那种方便的东西...

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.ModelBase返回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'

可以帮助我以一种不错的,可靠的方式弄清楚这一点吗?

我知道您可以只使用一个函数,将父级作为参数传递给它,VanillaMachine并使用一些if语句,但这太简单了,对吧?:)

编辑:

我遇到的其他方法是

  1. 使用Flask上下文使用Flask-SQLAlchemy模型

    with app.app_context():
        pass
    
    or 
    
    app.app_context().push()
    

但这对我来说太着重于Flask,并且不允许清晰地分离模型,使其独立并适应上下文。

  1. 提供替代基类db = SQLAlchemy(app, model_class=Base),见这里这可能对我有用,但是到目前为止,我还没有对此进行评估。

我发现了一个很好的解决方案,它受SQLAlchemy文档中提到Factory模式声明性Mixins的启发

对于复杂的多级继承方案,需要使用另一种方法@declared_attr.cascading


from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy import Column, Integer, String
from sqlalchemy import MetaData

from sqlalchemy.ext.declarative import declarative_base
from flask_sqlalchemy import SQLAlchemy

SQLALCHEMY_DATABASE_URI = 'sqlite:///' + '/tmp/test_app.db'
engine = create_engine(SQLALCHEMY_DATABASE_URI, echo=True)

# for vanilla
Base = declarative_base()

# for Flask (import from app once initialized)
db = SQLAlchemy()


class MachineMixin:

    __tablename__ = 'machine'
    id = Column(Integer, primary_key=True)
    name = Column(String(100))
    status = Column(Integer)


class ModelFactory:

    @staticmethod
    def create(which_model, which_parent):

        if which_parent == 'flask_sqlalchemy':

            parent = db.Model

        elif which_parent == 'pure_sqlalchemy':

            parent = Base

        # now use type() to interit, fill __dict__ and assign a name
        obj = type(which_model.__name__ + '_' + which_parent,
                    (which_model, parent),
                    {})
        return obj


test_scenario = 'pure_sqlalchemy' # 'flask_sqlalchemy'

Machine = ModelFactory.create(MachineMixin, test_scenario)

if test_scenario == 'flask_sqlalchemy':

    db.metadata.drop_all(bind=engine)
    db.metadata.create_all(bind=engine)

elif test_scenario == 'pure_sqlalchemy':

    Base.metadata.drop_all(bind=engine)
    Base.metadata.create_all(bind=engine)


Session = sessionmaker(bind=engine)
session = Session()
session.add(Machine(name='Bob', status=1))
session.commit()

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在现有的sqlalchemy模型中使用flask-sqlalchemy?

来自分类Dev

如何在现有的sqlalchemy模型中使用flask-sqlalchemy?

来自分类Dev

SQLAlchemy,对多个表使用相同的模型

来自分类Dev

sqlalchemy一对多关系,其中相同的外键在模型中使用两次

来自分类Dev

我如何解决TypeError:使用flask和Sqlite3时'NoneType'对象无法下标?

来自分类Dev

如何正确访问和使用烧瓶sqlalchemy中的sqlalchemy方法

来自分类Dev

将Flask SQLAlchemy模型与常规SQLAlchemy结合使用

来自分类Dev

如何在Flask SQLAlchemy中使用SUM聚合函数?

来自分类Dev

使用SQLAlchemy从应用程序正确分离模型的Python方法

来自分类Dev

使用SQLAlchemy从应用程序正确分离模型的Python方法

来自分类Dev

在Flask SqlAlchemy查询中使用to_char

来自分类Dev

在SQLAlchemy中使用联接

来自分类Dev

如何在模型中使用构造方法

来自分类Dev

如何通过ID使用SQLAlchemy查询模型

来自分类Dev

我可以同时使用Flask-SQLAlchemy和SQLAlchemy吗?

来自分类Dev

无法使用 Flask 和 SQLAlchemy 插入行

来自分类Dev

加入sqlalchemy后如何解决模棱两可的列

来自分类Dev

JVM如何解决Java中的重写和重写方法

来自分类Dev

if 语句错误和方法 append 中的 for 循环如何解决?

来自分类Dev

在SQLAlchemy中使用关系和ForeignKey模块

来自分类Dev

在SQLAlchemy中使用sum()和unnest()

来自分类Dev

flask_sqlalchemy的未解决的导入

来自分类Dev

未解决的参考:flask_sqlalchemy

来自分类Dev

Flask:使用带有关系的SQLalchemy模型填充WTform

来自分类Dev

使用 Flask-Sqlalchemy 从某个模型创建各种表

来自分类Dev

同一句子使用不同的意向模型和团队,如何解决?

来自分类Dev

如何协调运行Flask-Login,Flask-BrowserID和Flask-SQLAlchemy?

来自分类Dev

在测试方法和测试方法中使用相同的代码

来自分类Dev

在SQLAlchemy查询中使用for循环

Related 相关文章

  1. 1

    如何在现有的sqlalchemy模型中使用flask-sqlalchemy?

  2. 2

    如何在现有的sqlalchemy模型中使用flask-sqlalchemy?

  3. 3

    SQLAlchemy,对多个表使用相同的模型

  4. 4

    sqlalchemy一对多关系,其中相同的外键在模型中使用两次

  5. 5

    我如何解决TypeError:使用flask和Sqlite3时'NoneType'对象无法下标?

  6. 6

    如何正确访问和使用烧瓶sqlalchemy中的sqlalchemy方法

  7. 7

    将Flask SQLAlchemy模型与常规SQLAlchemy结合使用

  8. 8

    如何在Flask SQLAlchemy中使用SUM聚合函数?

  9. 9

    使用SQLAlchemy从应用程序正确分离模型的Python方法

  10. 10

    使用SQLAlchemy从应用程序正确分离模型的Python方法

  11. 11

    在Flask SqlAlchemy查询中使用to_char

  12. 12

    在SQLAlchemy中使用联接

  13. 13

    如何在模型中使用构造方法

  14. 14

    如何通过ID使用SQLAlchemy查询模型

  15. 15

    我可以同时使用Flask-SQLAlchemy和SQLAlchemy吗?

  16. 16

    无法使用 Flask 和 SQLAlchemy 插入行

  17. 17

    加入sqlalchemy后如何解决模棱两可的列

  18. 18

    JVM如何解决Java中的重写和重写方法

  19. 19

    if 语句错误和方法 append 中的 for 循环如何解决?

  20. 20

    在SQLAlchemy中使用关系和ForeignKey模块

  21. 21

    在SQLAlchemy中使用sum()和unnest()

  22. 22

    flask_sqlalchemy的未解决的导入

  23. 23

    未解决的参考:flask_sqlalchemy

  24. 24

    Flask:使用带有关系的SQLalchemy模型填充WTform

  25. 25

    使用 Flask-Sqlalchemy 从某个模型创建各种表

  26. 26

    同一句子使用不同的意向模型和团队,如何解决?

  27. 27

    如何协调运行Flask-Login,Flask-BrowserID和Flask-SQLAlchemy?

  28. 28

    在测试方法和测试方法中使用相同的代码

  29. 29

    在SQLAlchemy查询中使用for循环

热门标签

归档