【问题标题】:Python sqlalchemy mapping tables without primary key没有主键的Python sqlalchemy映射表
【发布时间】:2019-07-07 05:49:59
【问题描述】:

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

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

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]' }

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

【问题讨论】:

    标签: python orm sqlalchemy


    【解决方案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
    

    谢谢

    【讨论】:

    • __mapper_args__ 解决方案在尝试弄清楚如何使用使用 CREATE TABLE ... AS SELECT * 语句创建的 sqlite 数据库后为我工作,该语句必然不能有主键并且不能添加。
    【解决方案2】:

    如你所见here:

    primary_key – 一个 Column 对象的列表,定义了要针对此映射器的可选单元使用的主键。这通常只是 local_table 的主键,但可以在这里覆盖。

    所以你可以这样做:

    class MyTable(Base):
        __tablename__ = "my-table"
    
        field1 = Column(String(10))
        field2 = Column(String(10))
    
        __mapper_args__ = {
            "primary_key":[field1, field2]
        }
    

    【讨论】:

      猜你喜欢
      • 2018-07-11
      • 2018-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-07
      • 2013-03-26
      相关资源
      最近更新 更多