![](/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.