SQLAlchemy和动态指定的表关系

时间:2018-08-09 02:16:47

标签: python sqlalchemy

我想尝试使用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专家的一些想法。

0 个答案:

没有答案