在我们的系统中,我们有两个相似(但不相同)的数据库。所以我建立了这些 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
,我也无法实现它。有谁知道我该怎么办?