【问题标题】:Having two serial keys in postgresql via sqlalchemy通过 sqlalchemy 在 postgresql 中有两个序列号
【发布时间】:2015-11-03 03:12:20
【问题描述】:

我有一个不寻常的挑战。我正在修改一个表,以便能够与另外两个旧版 PostgreSQL 表组连接。

一个组几乎要求表中的每条记录都有一个唯一的整数。因此,以下字段定义将起作用:

numeric_id = sql.Column(sql.Integer, primary_key=True)

另一组表都对预期的 JOIN 请求使用 UUID 字段。因此,以下字段定义将起作用:

uu_account_id = sql.Column(UUID(as_uuid=True), primary_key=True)

但是,很明显,我不能有两个主键。所以其中一个不必是主键。制作新记录时,最好还是自动分配两者。

有什么建议吗?

我确信我可以快速破解,但我很好奇是否有一个干净利落的答案。

(不:更改其他表不是一种选择。遗留代码太多。)

【问题讨论】:

    标签: python postgresql sqlalchemy


    【解决方案1】:

    像往常一样将uuid 列设为主键。

    将另一列定义为具有serial 类型和unique。在 SQL 中我会写

    create table mytable (
        mytable_id uuid primary key default uuid_generate_v4(),
        mytable_legacy_id serial unique not null,
        ... other cols ...
    );
    

    所以你只需要对 not null, unique 字段进行 SQLAlchemy 等效项。

    请注意,“serial”只是简写

    create sequence tablename_colname_seq;
    create table tablename (
        colname integer default nextval('tablename_colname_seq'),
        ... cols ...
    );
    alter sequence tablename_colname_seq owned by tablename.colname;
    

    所以如果你不能让 sqlalchemy 认识到你可以有一个不是主键的序列字段,你可以这样做。

    【讨论】:

      【解决方案2】:

      在 SQLAlchemy、alembic(我也使用)和 PostgreSQL 之间,结果证明这很棘手。

      如果从头开始创建一个全新的表,以下内容适用于我的 numeric_id 列:

      numeric_id = sql.Column(sql.Integer, sql.Sequence('mytable_numeric_id_seq'), unique=True, nullable=False)
      

      unique=Truenullable=False 可能是矫枉过正。)

      但是,如果修改现有表,则无法创建序列本身。或者,至少,我无法让它工作。

      当然,可以手动创建序列。或者,如果使用“alembic”来简化分布式迁移,请添加:

      from sqlalchemy.schema import Sequence, CreateSequence
      
      def upgrade():
          op.execute(CreateSequence(Sequence("mytable_numeric_id_seq")))
      

      到 alembic 创建的 version 脚本。

      特别感谢 Craig 的帮助。

      (注意:网络上的大多数 SQLAlchemy 示例都使用 db. 作为模块别名,而不是 sql.。实际上是一样的。我使用 sql. 只是因为我已经将 db. 用于 MongoDB。 )

      【讨论】:

        猜你喜欢
        • 2021-10-08
        • 2021-12-03
        • 1970-01-01
        • 2018-01-26
        • 2022-01-14
        • 2017-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多