我有一个第三方数据库,尝试使用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]' }
不起作用。我该如何映射?感谢您的帮助
答案 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]
}