Hace un par de semanas me encontré con la sorpresa de trabajar con la función gen_random_uuid nativa de PostgreSQL en supabase y con el ORM prisma, que expone la extensión pgcrypto, aquí una breve explicación de cómo usar esta función para generar el UUID de versión 4.
PostgreSQL incluye una función para generar un UUID, la exponen con el nombre gen_random_uuid()
→ uuid. Esta función devuelve un UUID de versión 4 (aleatorio). Este es el tipo de UUID más utilizado y es apropiado para la mayoría de las aplicaciones y lo haremos con la ayuda de
Supabase + Prismajs.
Algunas funciones de bases de datos nativas son parte de una extensión. Por ejemplo,
gen_random_uuid()
es parte del módulopgcrypto
. El módulo pgcrypto proporciona funciones criptográficas para PostgreSQL.
Creando modelo User
En el schema.prisma
voy a crear el modelo User
con los siguientes atributos, la propiedad @default(uuid())
nos genera un identificador único global basado en la especificación UUID. Este es un ejemplo que puedes encontrar en la documentacion de prisma
model User {
id String @id @default(uuid())
name String
userName String @map("user_name")
}
Pero queremos hacer uso de la función gen_random_uuid()
de PostgreSQL, Así que los cambios que tenemos que hacer son los siguientes.
model User {
- id String @id @default(uuid())
+ id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid
dbgenerated
Representa valores predeterminados que no se pueden expresar en el esquema de Prisma (comorandom()
).
entonces nuestro modelo final sería el siguiente.
model User {
id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid
name String
userName String @map("user_name")
}
Veremos que en el dashboard de supabase al crear un nuevo usuario en la columna id
veremos po defecto gen_random_uuid()
.
Conclusión
En PostgreSQL, existen varias alternativas a los campos de ID, cada una de las cuales tiene un caso de uso adecuado para usar o no, con gen_random_uuid
lo que le devolverán son incuestionablemente únicos, lo que garantiza que reciba datos precisos.
También puede usar dbgenerated()
para establecer el valor predeterminado para los tipos admitidos. Por ejemplo, puede generar UUID a nivel de base de datos en lugar de depender del uuid()
de Prisma.