簡體   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