Elixir Ecto: 在Postgres中使用UUID类型的主键

前端之家收集整理的这篇文章主要介绍了Elixir Ecto: 在Postgres中使用UUID类型的主键前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

使用UUID作为主键的目的

降低Serial类型这种自增ID线性特征,UUID作为随机生成的字符串,让ID更离散,增强系统的反爬虫能力(至少避免通过ID的线性增加来爬取内容这种最简单的爬取方式)

使用主键的是那种方式,各有优缺点,可按实际需求自行权衡

这里只说明如何使用pgcrypto扩展自动生成UUID Type主键.

数据库方面

通过调用 pgcrypto 扩展模块中的 gen_random_uuid() 函数可以生成UUID. 要使用该函数,首先需要创建扩展:

CREATE EXTENSION pgcrypto;

生成UUID

SELECT gen_random_uuid();

作为主键使用

CREATE SCHEMA IF NOT EXISTS developerworks;  

CREATE TABLE developerworks.contacts (  
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),name TEXT,email TEXT
);

插入测试数据

INSERT INTO developerworks.contacts (name,email) VALUES  
('Dr Nic Williams','drnic'),('Brian Mattal','brian'),('Wayne E. Seguin','wayneeseguin'),('Long Nguyen','long'),('Bill Chapman','bill'),('Chris Weibel','chris'),('Jeremey Budnack','jrbudnack'),('Ruben Koster','rkoster'),('Jamie Van Dyke','jamie'),('Quintessence Anx','qanx'),('McGowan','mcg'),('高,秀娇 (XJ)','xj'),('Geoff Franks','geoff'),('Van Nguyen','vnguyen'),('John Longanecker','jlonganecker')
;

查询结果

SELECT * FROM developerworks.contacts;

迁移脚本定义

defmodule Jianpan.Repo.Migrations.CreatePrefixNodes do
  use Ecto.Migration

  def change do
    create table(:prefix_nodes,primary_key: false) do
      add :id,:uuid,primary_key: true,default: fragment("gen_random_uuid()")
      add :order,:integer
      add :name,:string
      add :is_deleted,:boolean,default: false,null: false
      add :parent_id,references(:prefix_nodes,type: :uuid,on_delete: :delete_all)

    end
    create index(:prefix_nodes,[:parent_id])

  end
end

参考资料

原文链接:https://www.f2er.com/postgresql/194032.html

猜你在找的Postgre SQL相关文章