1、在odoo的base下面的base_data.sql文件中添加以下代碼形成分布式id算法
CREATE SEQUENCE '表名' INCREMENT BY 1 START WITH 1;
CREATE OR REPLACE FUNCTION public.next_id(OUT result bigint) AS $$
DECLARE
-- 時間戳開始時間:2010年1月1日0點(diǎn)0分0秒,最大位數(shù)為41
our_epoch bigint := 1262275200000;
-- 當(dāng)前時間,最大位數(shù)為41
now_millis bigint;
-- 公有云id為1,私有云為0,最大位數(shù)為1
service_id bigint := 1;
-- 切片id為1,最大位數(shù)為9
shard_id int := 1;
-- id序列,最大位數(shù)為13
seq_id bigint;
BEGIN
SELECT nextval('public.表名') % 8192 INTO seq_id;
SELECT FLOOR(EXTRACT(EPOCH FROM clock_timestamp()) * 1000) INTO now_millis;
-- 生成的id結(jié)構(gòu)為 時間戳+公/私有云id+切片id+
result := ((now_millis - our_epoch) << 23);
result := result | (service_id << 22);
result := result | (shard_id << 13);
result := result | seq_id;
END;
$$ LANGUAGE PLPGSQL;
2、在odoo創(chuàng)建數(shù)據(jù)庫執(zhí)行建表sql時通過執(zhí)行算法將數(shù)據(jù)庫自動生成的id替換掉,同時為了處理js雙精度,不支持64位整數(shù)的問題,目前將id鍵在數(shù)據(jù)庫中存為string形式。
最終建成的數(shù)據(jù)庫如下
image.png