postgresql 如何使用prisma创建自定义唯一主键?

fnvucqvd  于 2023-04-20  发布在  PostgreSQL
关注(0)|答案(1)|浏览(237)

在我的应用程序中,我想创建一个默认的主键,该键必须以BL-开头,其余9位字符必须是随机的。
Schema

model myModel {
// try 1
id String @id @default(dbgenerated("BL-"))
// try 2
id  String @id @default(dbgenerated("BL-" + substring(uuid(), 1, 8)))

has context menu
Compose
// other fields
}

Migrations

-- AlterTable
ALTER TABLE "businessLoanOffers" ALTER COLUMN "id" SET DEFAULT BLO;

ERROR

Database error code: 0A000

 

Database error:
ERROR: cannot use column reference in DEFAULT expression

 

DbError { severity: "ERROR", parsed_severity: Some(Error), code: SqlState(E0A000), message: "cannot use column reference in DEFAULT expression", detail: None, hint: None, position: None, where_: None, schema: None, table: None, column: None, datatype: None, constraint: None, file: Some("parse_expr.c"), line: Some(530), routine: Some("transformColumnRef") }

我的另一种可能的解决方法是使用JS来创建我选择的primary-key,但我想使用prismapostresql来解决这个问题。

gjmwrych

gjmwrych1#

正如您所发现的,您不能将dbgenerated()用于您的用例,因为它仅限于数据库支持的默认表达式,并且不支持您尝试使用的自定义函数或串联。
但是,您可以通过在应用程序代码中使用自定义函数来实现所需的主键格式,以便在创建新记录时生成键。
您可以使用此函数作为引用来创建随机主键

function generateCustomId(prefix = 'BL-', length = 9) {
  const characters = '0123456789';
  let result = '';

  for (let i = 0; i < length; i++) {
    result += characters.charAt(Math.floor(Math.random() * characters.length));
  }

  return prefix + result;
}

相关问题