# Database 目录说明 ## 目录用途 `database/` 目录用于存放数据库相关的初始化脚本和迁移文件。 ## 文件说明 ### init.sql **用途**: 数据库初始化脚本 **使用场景**: - 在数据库首次创建后,需要插入初始数据时使用 - 在 Docker Compose 启动时自动执行 - 在测试环境中初始化测试数据 **执行方式**: ```bash # 手动执行(如果需要) psql -U postgres -d admin_service -f database/init.sql # 或通过 Docker Compose volume 映射自动执行 ``` ## 与 Prisma 的关系 ### Prisma Migrations - **位置**: `prisma/migrations/` - **用途**: 创建和管理数据库表结构 - **执行**: `npx prisma migrate deploy` ### database/init.sql - **位置**: `database/init.sql` - **用途**: 在表结构创建后,插入初始数据 - **执行**: 在 migrations 之后手动或自动执行 ## 执行顺序 正确的数据库初始化顺序: ``` 1. Prisma Migrations (创建表结构) ↓ 2. database/init.sql (插入初始数据) ``` ## Docker Compose 集成 如果需要在 Docker Compose 中使用初始化脚本,可以这样配置: ```yaml services: postgres: image: postgres:16-alpine volumes: - ./database/init.sql:/docker-entrypoint-initdb.d/01-init.sql - postgres_data:/var/lib/postgresql/data ``` **注意**: PostgreSQL Docker 镜像会自动执行 `/docker-entrypoint-initdb.d/` 目录中的 `.sql` 文件。 ## 当前状态 ### Admin Service - ✅ Prisma schema 定义完成 - ✅ Migrations 已创建 - ⚠️ 目前不需要初始数据 - ✅ init.sql 文件已创建(保留用于未来需求) ## 使用示例 ### 添加初始版本记录 如果需要在数据库初始化时插入默认版本,可以编辑 `init.sql`: ```sql INSERT INTO "AppVersion" ( id, platform, "versionCode", "versionName", "buildNumber", "downloadUrl", "fileSize", "fileSha256", changelog, "isEnabled", "isForceUpdate", "createdBy", "createdAt", "updatedAt" ) VALUES ( 'initial-android', 'android', 1, '1.0.0', '1', 'https://example.com/app-v1.apk', 10485760, 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', 'Initial release', true, false, 'system', NOW(), NOW() ) ON CONFLICT (id) DO NOTHING; ``` ## 参考其他服务 ### identity-service - 使用 `init.sql` 初始化账户序列号生成器 - 示例: `INSERT INTO account_sequence_generator` ### mpc-service - 使用 `database/migrations/` 存放自定义迁移 ## 最佳实践 1. **幂等性**: 所有 SQL 脚本都应该是幂等的(可重复执行) - 使用 `ON CONFLICT DO NOTHING` - 使用 `IF NOT EXISTS` 2. **注释**: 为所有初始化脚本添加清晰的注释 3. **版本控制**: 将 `database/` 目录纳入 Git 版本控制 4. **测试**: 确保初始化脚本在测试环境中正常工作 ## 故障排查 ### 初始化脚本未执行 **原因**: PostgreSQL 只在首次创建数据库时执行 initdb 脚本 **解决方案**: ```bash # 删除 volume 重新创建 docker-compose down -v docker-compose up ``` ### 重复执行错误 **原因**: 脚本不是幂等的 **解决方案**: 使用 `ON CONFLICT` 或 `IF NOT EXISTS` --- *最后更新: 2025-12-03*