gpt4 book ai didi

python - 用 uuid 替换整数 id 字段

转载 作者:行者123 更新时间:2023-11-29 12:56:14 25 4
gpt4 key购买 nike

我需要用一个 uuid 替换我模型中的默认整数 id。问题是它被用于另一个模型(外键)。知道如何在不丢失数据的情况下执行此操作吗?

class A(Base):
__tablename__ = 'a'

b_id = Column(
GUID(), ForeignKey('b.id'), nullable=False,
server_default=text("uuid_generate_v4()")
)

class B(Base):
__tablename__ = 'b'
id = Column(
GUID(), primary_key=True,
server_default=text("uuid_generate_v4()")
)

不幸的是它不起作用,而且我担心我会破坏关系。

sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) default for column "id" cannot be cast automatically to type uuid

我尝试过的 Alembic 迁移类似于:

op.execute('ALTER TABLE a ALTER COLUMN b_id SET DATA TYPE UUID USING (uuid_generate_v4())')

最佳答案

使用自动生成的 UUID 值向 b 添加一个 id_tmp 列,向 a 添加一个 b_id_tmp 列。更新外键上的连接 b 以使用相应的 UUID 填充 a.b_id_tmp。然后删除a.b_idb.id,重命名添加的列,并重新建立主键和外键。

CREATE TABLE a(id int PRIMARY KEY, b_id int);
CREATE TABLE b(id int PRIMARY KEY);

ALTER TABLE a ADD CONSTRAINT a_b_id_fkey FOREIGN KEY(b_id) REFERENCES b(id);

INSERT INTO b VALUES (1), (2), (3);
INSERT INTO a VALUES (1, 1), (2, 2), (3, 2);

ALTER TABLE b ADD COLUMN id_tmp UUID NOT NULL DEFAULT uuid_generate_v1mc();
ALTER TABLE a ADD COLUMN b_id_tmp UUID;

UPDATE a SET b_id_tmp = b.id_tmp FROM b WHERE b.id = a.b_id;

ALTER TABLE a DROP COLUMN b_id;
ALTER TABLE a RENAME COLUMN b_id_tmp TO b_id;
ALTER TABLE b DROP COLUMN id;
ALTER TABLE b RENAME COLUMN id_tmp TO id;
ALTER TABLE b ADD PRIMARY KEY (id);
ALTER TABLE a ADD CONSTRAINT b_id_fkey FOREIGN KEY(b_id) REFERENCES b(id);

顺便说一句,索引 v1 UUID 比索引 v4 更有效,因为它们包含一些可重现的信息,如果您连续生成多个信息,您会注意到这些信息。除非您出于外部安全原因需要更高的随机性,否则节省的钱很少。

关于python - 用 uuid 替换整数 id 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42674931/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com