我想尝试使用SQLAlchemy作为探索包括Teradata和Oracle在内的一些数据库中的数据表的方法。
我有一组表,这些表可能有也可能没有众所周知的外键,我试图找到一种方法来定义这些关系,以便可以即时指定它们。
我注意到的关于SQLAlchemy的一件事是,它似乎迫使您围绕数据模型概念(例如主键和外键,唯一性等)使用最佳实践。实际上,有时数据和关系并不完全适合于此。模型
请考虑以下表格:
Base = declarative_base(cls=DeferredReflection)
class table1(Base):
__tablename__ = "table1"
__table_args__ = {'schema': 'schemaname'}
acct_id = Column(DECIMAL(precision=15), primary_key=True)
relation1 = relationship("table2")
class table2(Base):
__tablename__ = "table2"
__table_args__ = {'schema': 'schemaname'}
id = Column(String(length=128), ForeignKey('table1.some_col'), primary_key=True)
Base.prepare(td_engine)
Table2通过table1.some_col = table2.id
上的联接与table1相关,现在我可以在SQLAlchemy中的这两个表上编写联接以进行任何操作。
现在,请考虑存在其他某个表table3
,但我不知道该表中的哪些列可能会联接到另一个表中的列。可能存在或可能没有可连接的列,或者我可能不得不基于一些属性之类的coalesce
之类的逻辑创建一个混合属性。
class table3(Base):
__tablename__ = "table3"
__table_args__ = {'schema': 'schemaname'}
some_other_id = Column(String(length=128), primary_key=True)
我正在尝试找到一种方法,以便定义一个可以动态更改外键的类方法,以便可以针对其他表测试联接。
到目前为止我最好的猜测:
class table3(Base):
__tablename__ = "table3"
__table_args__ = {'schema': 'schemaname'}
some_other_id = Column(String(length=128), primary_key=True)
def clearForeignKeys(self):
self.__table__.foreign_keys = []
def addForeignKey(self):
self.attr_name = Column(String(length=128), ForeignKey('table1.some_other_attr'))
如果我尝试这样做,是要破坏我的元数据还是给自己带来奇怪的问题?我很想听听SQLAlchemy专家的一些想法。