Как динамически переключать sqlalchemy модель через графеновое реле? - PullRequest
0 голосов
/ 24 декабря 2018

В нашей системе у нас есть две похожие (но не одинаковые) базы данных.Итак, я построил эти модели 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)

Теперь я хочу построить нашу систему API с помощью graphql.Во-первых, я наследую от 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, я не могу реализовать его.Кто-нибудь знает, что мне делать?

...