fix(schema): 统一使用 TEXT 类型替代 VARCHAR

问题:
- 之前 schema 和 migration 中使用了 VARCHAR(n) 限制字段长度
- Prisma 的 String 类型默认映射到 PostgreSQL TEXT
- VARCHAR 和 TEXT 在 PostgreSQL 中性能相同,VARCHAR 限制反而增加风险

修复:
1. contribution-service:
   - schema: 移除 accountType/baseType/regionCode/name 的 @db.VarChar
   - migration: VARCHAR -> TEXT

2. mining-service:
   - schema: 移除 accountType/baseType/regionCode/name 的 @db.VarChar
   - migration: VARCHAR -> TEXT

3. mining-admin-service:
   - migration: VARCHAR -> TEXT (schema 已使用 TEXT)

原则:Prisma String 直接使用,不加 @db.VarChar()

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
hailin 2026-01-20 20:24:01 -08:00
parent 5f2f223f7b
commit 9c816266ac
5 changed files with 27 additions and 33 deletions

View File

@ -1,9 +1,9 @@
-- 系统账户按省市细分: 添加 base_type 和 region_code 字段
-- 将 accountType 从简单枚举改为组合键(如 PROVINCE_440000, CITY_440100
-- 1. 添加新字段
ALTER TABLE "system_accounts" ADD COLUMN "base_type" VARCHAR(20);
ALTER TABLE "system_accounts" ADD COLUMN "region_code" VARCHAR(10);
-- 1. 添加新字段 (使用 TEXT 类型与 Prisma String 一致)
ALTER TABLE "system_accounts" ADD COLUMN "base_type" TEXT;
ALTER TABLE "system_accounts" ADD COLUMN "region_code" TEXT;
-- 2. 设置现有数据的 base_type与 account_type 相同)
UPDATE "system_accounts" SET "base_type" = "account_type" WHERE "base_type" IS NULL;
@ -11,9 +11,6 @@ UPDATE "system_accounts" SET "base_type" = "account_type" WHERE "base_type" IS N
-- 3. 将 base_type 设置为非空
ALTER TABLE "system_accounts" ALTER COLUMN "base_type" SET NOT NULL;
-- 4. 修改 account_type 字段长度以支持组合键
ALTER TABLE "system_accounts" ALTER COLUMN "account_type" TYPE VARCHAR(50);
-- 5. 创建索引Prisma 默认命名格式: {table}_{field}_idx
-- 4. 创建索引Prisma 默认命名格式: {table}_{field}_idx
CREATE INDEX IF NOT EXISTS "system_accounts_base_type_idx" ON "system_accounts"("base_type");
CREATE INDEX IF NOT EXISTS "system_accounts_region_code_idx" ON "system_accounts"("region_code");

View File

@ -302,10 +302,10 @@ model UnallocatedContribution {
// PROVINCE_440000, CITY_440100 等 (按省市细分的账户)
model SystemAccount {
id BigInt @id @default(autoincrement())
accountType String @unique @map("account_type") @db.VarChar(50) // 组合键: PROVINCE_440000, CITY_440100 等
baseType String @map("base_type") @db.VarChar(20) // 基础类型: OPERATION / PROVINCE / CITY / HEADQUARTERS
regionCode String? @map("region_code") @db.VarChar(10) // 区域代码: 省/市代码,如 440000, 440100
name String @db.VarChar(100)
accountType String @unique @map("account_type") // 组合键: PROVINCE_440000, CITY_440100 等
baseType String @map("base_type") // 基础类型: OPERATION / PROVINCE / CITY / HEADQUARTERS
regionCode String? @map("region_code") // 区域代码: 省/市代码,如 440000, 440100
name String
contributionBalance Decimal @default(0) @map("contribution_balance") @db.Decimal(30, 10)
contributionNeverExpires Boolean @default(false) @map("contribution_never_expires")

View File

@ -1,9 +1,9 @@
-- 同步的系统账户算力表按省市细分: 添加 base_type 和 region_code 字段
-- 支持组合键(如 PROVINCE_440000, CITY_440100
-- 1. 添加新字段
ALTER TABLE "synced_system_contributions" ADD COLUMN "base_type" VARCHAR(20) DEFAULT '';
ALTER TABLE "synced_system_contributions" ADD COLUMN "region_code" VARCHAR(10);
-- 1. 添加新字段 (使用 TEXT 类型与 Prisma String 一致)
ALTER TABLE "synced_system_contributions" ADD COLUMN "base_type" TEXT NOT NULL DEFAULT '';
ALTER TABLE "synced_system_contributions" ADD COLUMN "region_code" TEXT;
-- 2. 设置现有数据的 base_type根据 account_type 提取)
UPDATE "synced_system_contributions"
@ -12,11 +12,8 @@ SET "base_type" = CASE
WHEN "account_type" LIKE 'CITY_%' THEN 'CITY'
ELSE "account_type"
END
WHERE "base_type" = '' OR "base_type" IS NULL;
WHERE "base_type" = '';
-- 3. 将 base_type 设置为非空
ALTER TABLE "synced_system_contributions" ALTER COLUMN "base_type" SET NOT NULL;
-- 4. 创建索引Prisma 默认命名格式: {table}_{field}_idx
-- 3. 创建索引Prisma 默认命名格式: {table}_{field}_idx
CREATE INDEX IF NOT EXISTS "synced_system_contributions_base_type_idx" ON "synced_system_contributions"("base_type");
CREATE INDEX IF NOT EXISTS "synced_system_contributions_region_code_idx" ON "synced_system_contributions"("region_code");

View File

@ -11,10 +11,10 @@ ALTER TABLE "system_mining_transactions" DROP CONSTRAINT IF EXISTS "system_minin
-- 步骤 2: 修改 system_mining_accounts 主表
-- ============================================================
-- 2.1 添加新列
ALTER TABLE "system_mining_accounts" ADD COLUMN "account_type_new" VARCHAR(50);
ALTER TABLE "system_mining_accounts" ADD COLUMN "base_type" VARCHAR(20);
ALTER TABLE "system_mining_accounts" ADD COLUMN "region_code" VARCHAR(10);
-- 2.1 添加新列 (使用 TEXT 类型与 Prisma String 一致)
ALTER TABLE "system_mining_accounts" ADD COLUMN "account_type_new" TEXT;
ALTER TABLE "system_mining_accounts" ADD COLUMN "base_type" TEXT;
ALTER TABLE "system_mining_accounts" ADD COLUMN "region_code" TEXT;
-- 2.2 迁移数据:将枚举值转为字符串
UPDATE "system_mining_accounts"
@ -42,8 +42,8 @@ CREATE INDEX IF NOT EXISTS "system_mining_accounts_region_code_idx" ON "system_m
-- 步骤 3: 修改 system_mining_records 表
-- ============================================================
-- 3.1 添加新列并迁移数据
ALTER TABLE "system_mining_records" ADD COLUMN "account_type_new" VARCHAR(50);
-- 3.1 添加新列并迁移数据 (使用 TEXT)
ALTER TABLE "system_mining_records" ADD COLUMN "account_type_new" TEXT;
UPDATE "system_mining_records" SET "account_type_new" = "account_type"::TEXT;
-- 3.2 删除旧的唯一索引和列
@ -67,8 +67,8 @@ ALTER TABLE "system_mining_records"
-- 步骤 4: 修改 system_mining_transactions 表
-- ============================================================
-- 4.1 添加新列并迁移数据
ALTER TABLE "system_mining_transactions" ADD COLUMN "account_type_new" VARCHAR(50);
-- 4.1 添加新列并迁移数据 (使用 TEXT)
ALTER TABLE "system_mining_transactions" ADD COLUMN "account_type_new" TEXT;
UPDATE "system_mining_transactions" SET "account_type_new" = "account_type"::TEXT;
-- 4.2 删除旧列

View File

@ -57,10 +57,10 @@ model MiningEra {
// PROVINCE_440000, CITY_440100 等 (按省市细分的账户)
model SystemMiningAccount {
id String @id @default(uuid())
accountType String @unique @map("account_type") @db.VarChar(50) // 组合键
baseType String @map("base_type") @db.VarChar(20) // 基础类型: OPERATION/PROVINCE/CITY/HEADQUARTERS
regionCode String? @map("region_code") @db.VarChar(10) // 区域代码
name String @db.VarChar(100)
accountType String @unique @map("account_type") // 组合键
baseType String @map("base_type") // 基础类型: OPERATION/PROVINCE/CITY/HEADQUARTERS
regionCode String? @map("region_code") // 区域代码
name String
totalMined Decimal @default(0) @db.Decimal(30, 8) // 总挖到的积分股
availableBalance Decimal @default(0) @db.Decimal(30, 8) // 可用余额
totalContribution Decimal @default(0) @db.Decimal(30, 8) // 当前算力(从 contribution-service 同步)
@ -80,7 +80,7 @@ model SystemMiningAccount {
// 系统账户挖矿记录(分钟级别汇总)
model SystemMiningRecord {
id String @id @default(uuid())
accountType String @map("account_type") @db.VarChar(50) // 组合键
accountType String @map("account_type") // 组合键
miningMinute DateTime @map("mining_minute")
contributionRatio Decimal @db.Decimal(30, 18) @map("contribution_ratio")
totalContribution Decimal @db.Decimal(30, 8) @map("total_contribution")
@ -98,7 +98,7 @@ model SystemMiningRecord {
// 系统账户交易流水
model SystemMiningTransaction {
id String @id @default(uuid())
accountType String @map("account_type") @db.VarChar(50) // 组合键
accountType String @map("account_type") // 组合键
type String // MINE, TRANSFER_OUT, ADJUSTMENT
amount Decimal @db.Decimal(30, 8)
balanceBefore Decimal @db.Decimal(30, 8) @map("balance_before")