![](/img/trans.png)
[英]Set SQLAlchemy to use PostgreSQL SERIAL for identity generation
[英]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=True
和nullable=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.