如何通过石墨烯中继动态切换sqlalchemy模型?

时间:2018-12-24 10:11:35

标签: python graphql relay graphene-python graphene-sqlalchemy

在我们的系统中,我们有两个相似(但不相同)的数据库。所以我建立了这些sqlalchemy模型:

# base.py
Base = declarative_base()

class T1(Base):
    __tablename__ = 't1'
    id = Column(Integer, primary_key=True)
    name = Column(String)

# production1.py
from . import base

class T1(base.T1):
    status1 = Column(String)

# production2.py
from . import base

class T1(base.T1):
    status2 = Column(String)

# sessions.py
engine1 = create_engine(**production1_params)
session1 = scoped_session(sessionmaker(bind=engine1))
engine2 = create_engine(**production2_params)
session2 = scoped_session(sessionmaker(bind=engine2))

然后我可以通过以下方式访问其他数据库:

import production1, production2
session1().query(production1.T1)
session2().query(production2.T2)

现在,我想通过graphql构建我们的API系统。首先,我继承自SQLAlchemyConnectionField以支持数据库切换。

class SwitchableConnectionField(SQLAlchemyConnectionField):
    def __init__(self, type, *args, **kwargs):
        kwargs.setdefault('db_type', String())
        super

    @classmethod
    def get_query(self, model, info, sort=None, **args):
        session = get_query(args['db_type'])
        query = session.query(model)
        ...

但是当我想定义我的节点时,我发现定义必须是:

import production1, production2

class Production1Node(SQLAlchemyObjectType):
    class Meta:
        model = production1,T1
        interfaces = (Node,)

class Production2Node(SQLAlchemyObjectType):
    class Meta:
        model = production2.T1
        interfaces = (Node,)

有两个节点定义可支持不同的数据库。但我想做类似的事情:

import base

class ProductionNode(SQLAlchemyObjectType):
    class Meta:
        model = base.T1
        interfaces = (Node,)

这样我可以在运行时切换类似的模型。但是,即使我尝试从Node继承,也无法实现它。有谁知道我该怎么办?

0 个答案:

没有答案