【问题标题】:How to insert composite primary key using SQLAlchemy?如何使用 SQLAlchemy 插入复合主键?
【发布时间】:2020-09-29 23:28:46
【问题描述】:

当我尝试插入复合主键连接时返回 0 行:

CompetitionRound = sa.Table('CompetitionRound', metadata,
                            sa.Column('CompetitionId', sa.Integer, sa.ForeignKey('Competitions.Id'), primary_key=True),
                            sa.Column('RoundId', sa.Integer, sa.ForeignKey('Rounds.Id'), primary_key=True))
...
competition_round_insert = await conn.execute(
    CompetitionRound.insert()
                    .values(CompetitionId=competition_id,
                            RoundId=round_id))
competition_round_row = await competition_round_insert.fetchone()

似乎不可能将复合主键作为值插入......但是在这种情况下如何插入键? 不幸的是,我没有在 SQLAlchemy 文档中找到一些示例......(

【问题讨论】:

    标签: python sqlalchemy aiopg


    【解决方案1】:

    根据我对文档的理解,SQLAlchemy 仅隐式返回 autoincrement 主键,而复合 PK 则不是:

    autoincrement

    autoincrement 标志现在默认为“auto”,这表示默认情况下自动增量语义仅适用于单列整数主键;对于复合(多列)主键,永远不会隐式启用自动增量;与往常一样, autoincrement=True 最多允许这些列中的一个成为“自动增量”列。 autoincrement=True 也可以在具有显式客户端或服务器端默认值的列上设置,但受后端数据库和方言的限制。

    inserted_primary_key

    请注意,指定 server_default 子句的主键列,或者不符合“自动增量”列的条件(参见列中的注释),并且使用数据库端默认值生成,将在此列表中显示为无,除非后端支持“返回”,并在启用“隐式返回”的情况下执行插入语句。

    意味着您可能希望在插入时使用an explicit returning clause。并不是说我真的明白这一点,但自从您插入它们以来,您显然拥有相关的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-20
      • 1970-01-01
      • 1970-01-01
      • 2021-08-21
      • 1970-01-01
      • 2014-06-17
      相关资源
      最近更新 更多