/** * 导入 short-link JSON 数据到数据库 * 运行: bun run scripts/import-data.ts */ import { drizzle } from 'drizzle-orm/node-postgres'; import { shortLink } from '@/db/schemas/n-code-schema.ts'; import { useConfig } from '@kevisual/use-config'; import { readFileSync } from 'node:fs'; import { resolve } from 'node:path'; const config = useConfig() as any; const DATABASE_URL = config.DATABASE_URL || process.env.DATABASE_URL || ''; if (!DATABASE_URL) { console.error('缺少 DATABASE_URL 配置'); process.exit(1); } const db = drizzle(DATABASE_URL); // 读取 JSON 数据 const jsonPath = resolve(import.meta.dir, 'ncode-list.json'); const rawData = JSON.parse(readFileSync(jsonPath, 'utf-8')) as Array<{ code: string; data: Record; description: string; slug: string; tags: string[]; title: string; type: string; userId: string; version: string; }>; async function importData() { console.log(`准备导入 ${rawData.length} 条 short-link 数据...`); let inserted = 0; let skipped = 0; const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i; for (const item of rawData) { const userId = item.userId && uuidRegex.test(item.userId) ? item.userId : null; try { await db .insert(shortLink) .values({ slug: item.slug, code: item.code, type: item.type || 'link', version: item.version || '1.0', title: item.title || '', description: item.description || '', tags: item.tags ?? [], data: item.data ?? {}, userId: userId as any, }) .onConflictDoNothing(); console.log(` ✓ 导入: slug=${item.slug}, code=${item.code}, title=${item.title}`); inserted++; } catch (err: any) { const cause = err.cause || err; console.warn(` ✗ 跳过: slug=${item.slug}, code=${item.code} — ${cause.message || err.message}`); skipped++; } } console.log(`\n完成: 成功 ${inserted} 条,跳过 ${skipped} 条`); process.exit(0); } importData().catch((err) => { console.error('导入失败:', err); process.exit(1); });