没有主键的Python sqlalchemy映射表

时间:2019-07-07 05:49:59

标签: python orm sqlalchemy

我有一个第三方数据库,尝试使用sqlalchemy和python进行映射。数据库中的表不使用主键。而且我喜欢自己避免表定义,因为表有很多列。所以我写了下面的代码

在sqlalchemy的文档中找到以下映射器args。

class MyTable(Base):
  __tablename__ = 'MyTable'
  __mapper_args__ = {'primary_key':[some_table_with_no_pk.c.uid, some_table_with_no_pk.c.bar]
.....
}

但是对我来说,不清楚如何添加正确的命名,例如

{'primary_key':['MyTable', 'MyColumnInTable'] }
or
{'primary_key':'[MyTable, MyColumnInTable]' }

不起作用。我该如何映射?感谢您的帮助

2 个答案:

答案 0 :(得分:1)

找到正确的语法:

class Channel(Base):

   __tablename__ = 'MyTable'
   __table__ = Table(__tablename__, Base.metadata, autoload=True, autoload_with=Engine)   
   __mapper_args__ = {'primary_key': [__table__.c.MyColumnInTable]} 
... 
}

这对我有用。

另一个解决方案是: 覆盖反映的列(也可以在sqlalchemy doku中找到)

Column('MyColumnInTable', Integer, primary_key=True),   # override reflected 'id' to have primary key

谢谢

答案 1 :(得分:0)

您可以阅读here

primary_key –列对象的列表,这些对象定义了用于此映射器的可选单位的主键。通常,这只是local_table的主键,但是可以在此处覆盖。

因此您可以这样做:

class MyTable(Base):
    __tablename__ = "my-table"

    field1 = Column(String(10))
    field2 = Column(String(10))

    __mapper_args__ = {
        "primary_key":[field1, field2]
    }