繁体   English   中英

通过SQLAlchemy在PostgreSQL中有两个串行键

[英]Having two serial keys in postgresql via sqlalchemy

我面临着不寻常的挑战。 我正在修改一个表,使其能够与其他两个旧的PostgreSQL表组连接。

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

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

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

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

但是,显然,我不能有两个主键。 因此,其中之一不必是主键。 只需在创建新记录时同时自动将它们都分配即可。

有什么建议么?

我确定我可以快速进行破解,但是我很好奇是否有一个很好的答案。

(并且不行:更改其他表是不行的。过多的遗留代码。)

像往常一样,将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识别出您可以拥有不是主键的串行字段,则可以改用这种方式。

在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.仅仅是因为我已经为MongoDB使用db. .。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM