@danielcok17/prisma-db (英语)
与双Prisma客户端共享 Prisma 设置: 用于您的应用表格( )app 计划),用于现有法律表格(schema)public 计划.
结构
prisma/app.prisma- 你的模型,迁移到这里(使用图)app(中文(简体) )prisma/law.prisma- 现有public.law_*财务报告和审定财务报表public.version_paragraphs表格(仅回顾)src/utils.ts- 出口appPrisma财务报告和审定财务报表lawPrisma
脚本
npm run db:generate- 生成两个Prisma客户端npm run db:migrate- 管理迁移app.prisma仅限npm run db:migrate:prod- 部署迁移(应用程序)npm run db:pull:law- 对现有公法表格进行回顾npm run db:studio- 打开Prisma工作室app
导入
import { appPrisma, lawPrisma } from '@danielcok17/prisma-db';
// or direct clients if you need advanced typing control
import { AppPrismaClient, LawPrismaClient } from '@danielcok17/prisma-db';
环境
在您的运行时间/ 构建中设置以下 Env vars( 名称匹配 .prisma 文件数 :
POSTGRES_PRISMA_URL=postgres://USER:PASS@HOST:PORT/DB?schema=app
POSTGRES_URL_NON_POOLING=postgres://USER:PASS@HOST:PORT/DB?schema=app
POSTGRES_PRISMA_URL_LAW=postgres://READONLY_USER:PASS@HOST:PORT/DB
POSTGRES_URL_NON_POOLING_LAW=postgres://READONLY_USER:PASS@HOST:PORT/DB
注释:
- 使用只读角色
POSTGRES_PRISMA_URL_LAW。 。 。 . - 确保 DB 有
CREATE SCHEMA IF NOT EXISTS app;执行一次.
Schema 路径( 用于工具 / CI)
此软件包发布 prisma 目录。 您可以在程序上获得计划绝对路径 :
import { appPrismaSchemaPath, lawPrismaSchemaPath, prismaMigrationsPath } from '@danielcok17/prisma-db';
实例:
# Use the packaged app schema with Prisma CLI
npx prisma migrate deploy --schema "$(node -e "console.log(require('@danielcok17/prisma-db').appPrismaSchemaPath)")"
# Or resolve directly to the file shipped in the package
APP_SCHEMA=$(node -e "console.log(require.resolve('@danielcok17/prisma-db/prisma/app.prisma'))")
npx prisma generate --schema "$APP_SCHEMA"
安装
npm install --save-exact @danielcok17/prisma-db@<x.y.z>
# or
yarn add @danielcok17/prisma-db
软件包运行 Prisma 生成于邮站. 如果您的环境阻挡了生命周期脚本, 请使用手动生成 appPrismaSchemaPath 如下所示.
快开始
- 设置 Env vars( 匹配在
.prisma文件数 :
POSTGRES_PRISMA_URL=postgres://USER:PASS@HOST:PORT/DB?schema=app
POSTGRES_URL_NON_POOLING=postgres://USER:PASS@HOST:PORT/DB?schema=app
POSTGRES_PRISMA_URL_LAW=postgres://READONLY_USER:PASS@HOST:PORT/DB
POSTGRES_URL_NON_POOLING_LAW=postgres://READONLY_USER:PASS@HOST:PORT/DB
- 应用迁移到
app计划 :
APP_SCHEMA=$(node -e "console.log(require('@danielcok17/prisma-db').appPrismaSchemaPath)")
npx prisma migrate deploy --schema "$APP_SCHEMA"
- 使用客户端 :
import { appPrisma, lawPrisma } from '@danielcok17/prisma-db';
const users = await appPrisma.user.findMany();
const laws = await lawPrisma.lawVersion.findMany({ take: 5 });
哪些数据库迁移(IP-011 Q5)
这个寄存器拥有应用计划及其迁移历史. 只有这个
寄存器将迁移到 DEV 和 PROD,通过
.github/workflows/migrate.yml. 聊天人- ii 和 rag- backend 永不运行
prisma migrate deploy 部署时; 编译服务 db_schema_check 运行
prisma migrate status 并停止从数据库开始应用程序
缺乏迁移 图像船.
规则:
- 消费者一号 准确 版本 (
"@danielcok17/prisma-db": "1.20.37",没有^, (中文(简体) ), 两个仓库都一样 从不latest。 。 。 . - 永远不要编辑应用到任何地方的迁移 。 以一新相接而后行.
- 应用程序中没有 DDL( 无运行时间)
CREATE TABLE没有脚本. law.prisma仅仅是回顾( e)npm run db:pull:law它从未迁移.- 审查每个生成的 SQL 文件 .
prisma migrate dev目前也发出DROP TABLE "BackgroundJob"财务报告和审定财务报表DROP TABLE "legal_opinion"(由 没有模型的迁移app.prisma),从不进行这些滴入.
扩大合同
每次发布都必须与先前的应用程序图像配合,因为数据库 在应用程序部署之前迁移,然后回滚 图像在新的计划.
- 扩展 (任何释放):新表格、新可失效的栏或栏 默认,新索引。 后补入分出步出或放出.
- 合同 (后来发布,在每一个部署的消费者停止使用旧的)
形状: 放下或重命名一列或一表, 缩小类型, 添加
NOT NULL无 默认,添加对现有数据的独特约束.
重命名总是被扩展( 添加新字) - > 既写入又读取新字的部署代码 - > 合同(旧的),以后发布.
部署命令
| 步骤 | 大卫 | 方案 |
|---|---|---|
| 1个 | 将策略 PR 合并为 main。 。 。 . publish-npm.yml 校验、 碰撞补丁版本并发布 | - 说吧 |
| 2个 | publish-npm.yml 电话 migrate.yml 页:1 development 带有新版本 | 运行 migrate.yml 手动 : environment=production,同一版本(在 main bE/FE的释放) |
| 3个 | 将精确的版本按入rag-backend和chatbot-ui,合并到 develop | 释放后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端后端下端后端后端后端后端后端后端后端后端后端后端后端后端后端后端 |
| 页:1 | 部署,然后是FE; db_schema_check 通过 | db_schema_check 通过 |
如果第2步被跳过, db_schema_check 失败, 且新应用程序容器是
不开始(在PROD聊天机-i上先停止旧的容器,所以这意味着停机时间).
总是在版本被撞倒之前迁移.
出版前的验证
publish-npm.yml 运行在每一个 PR 到 main 在每次出版之前
清洁 PostgreSQL 15 (PROD)和 18 (DEV) 服务容器:
prisma validate页:1app.prisma财务报告和审定财务报表law.prisma, (中文(简体) ),prisma migrate deploy整个历史,然后prisma migrate status, (中文(简体) ),scripts/check-migration-drift.sh: 重放的数据库必须相等app.prisma(只允许记录已知漂移), 和每个数据库中的功能prisma/functions.lock必须与其md5(pg_get_functiondef)(功能由名称来表示,例如._v1,永远 出版后更改,npm run build财务报告和审定财务报表scripts/check-pack.mjs焦油丸里有两种药方, 每个migration.sql, (中文(简体) ),migration_lock.toml财务报告和审定财务报表dist。 。 。 .
版本的凸起只在验证后发生,所以一个失败的检查不会公布任何内容.
正在迁移。 yml
# DEV (normally automatic after a publish)
gh workflow run migrate.yml --ref main -f version=1.20.37 -f environment=development
# PROD (manual only, from main, before the BE/FE release)
gh workflow run migrate.yml --ref main -f version=1.20.37 -f environment=production
任务验证了准确的版本( T)x.y.z,必须公布),准确
Prisma CLI 版本从 package-lock.json发送 deploy/migrate-on-host.sh
超过SSH。 在主机上,脚本使用共享部署锁定(等待最多1200 s,因为
部署通过旧版IP-012的排水口 把它拖走 然后运行一个丢弃
node 后端网络上下载
软件包 npm pack,安装被绑定的 Prisma CLI,运行 prisma migrate deploy
财务报告和审定财务报表 prisma migrate status。数据库 URL 运行于 stdin 时进入 a 0600 env 文件和
从不出现在命令行或日志中。 运行按环境序列进行.
DEV (英语:smartlex(中文(简体) ) | PROD(solty(中文(简体) ) | |
|---|---|---|
| SSH 服务器 | 强制命令 /opt/smartlex/ops/ci/ci-deploy.sh (单位:千美元)migrate db-dev <version>(中文(简体) ) | plain SSH, 脚本复制到 ~/deploy/prisma-migrate/ |
| 锁定 | /opt/smartlex/ops/ci/.deploy.lock (与FE/BE DEV部署共用) | ~/deploy/.deploy.lock (与FE/BE PROD的部署共享:聊天机-i和后端 deploy/ci/prod-deploy.sh 从IP-012阶段开始 |
| 网络 | develop_backend | prod_backend |
需要此寄存器中的 GitHub 环境( 只名, 相同值)
Rag后端的环境; 数据库 URL 必须是 不变 对那些
应用程序的使用,包括任何 ?schema= 参数 :
| 环境 | 变量 | 秘诀 |
|---|---|---|
development (处级政策) main(中文(简体) ) | SERVER_IP, (中文(简体) ), SERVER_PORT, (中文(简体) ), SERVER_USER, (中文(简体) ), SERVER_KNOWN_HOSTS | PRIVATE_SERVER_KEY, (中文(简体) ), POSTGRES_PRISMA_URL, (中文(简体) ), POSTGRES_URL_NON_POOLING |
production (处级政策) main(中文(简体) ) | SERVER_IP, (中文(简体) ), SERVER_PORT, (中文(简体) ), SERVER_USER, (中文(简体) ), SERVER_KNOWN_HOSTS | PRIVATE_SERVER_KEY, (中文(简体) ), POSTGRES_PRISMA_URL, (中文(简体) ), POSTGRES_URL_NON_POOLING |
DEV 输入点接受 migrate db-dev <x.y.z> 仅取自
deploy/ci/ssh-entrypoint.sh 搭载IP-011Q5 PR的飞船,载入聊天舱
后端; 安装在 smartlex 在第一次 DEV 运行前( 参见后端)
deploy/ci/README.md,"一次性SSH入站安装"部分.
迁移失败
prisma migrate deploy 在第一次失败的迁移时停止,并将它记录为
失败; db_schema_check 然后使新的应用程序容器从开始
继续运行。 运行时绝不编辑已失败的迁移
随便哪里 解决原因,然后在主机标记上 它滚回
(单位:千美元)prisma migrate resolve --rolled-back <name> 在同一被丢弃的容器中)
或运送经过更正的后续移民,并运行 migrate.yml 再来一次.
历史上采用的表格
20261015120000_adopt_security_rate_limit_and_document_draft_session 通过
SecurityRateLimit (话语) scripts/bootstrap-rate-limit-table.mjs和
DocumentDraftSession (破旧后端) migrateDocumentDraftSession) (中文(简体) ). 两个都已经
在DEV和PROD上存在;迁移用途 CREATE ... IF NOT EXISTS 然后检查
列类型,无效性和主键,所以它是对已有的,
匹配表格,在干净的数据库中创建表格,在表格中大声失败
以相别相.
地方发展
仅限本地开发数据库. 共享的DEV和PROD由
migrate.yml (见上文),绝不来自消费者.
npm install --save-exact @danielcok17/prisma-db@<x.y.z>
APP_SCHEMA=$(node -e "console.log(require('@danielcok17/prisma-db').appPrismaSchemaPath)")
npx prisma generate --schema "$APP_SCHEMA"
npx prisma migrate deploy --schema "$APP_SCHEMA" # local database only
npx prisma migrate status --schema "$APP_SCHEMA" # what the consumers' db_schema_check runs
不运行 prisma migrate dev 在消费者应用。 在此中更改Schema
存储器并作为版本发布.
Prisma 工作室( 可选)
APP_SCHEMA=$(node -e "console.log(require('@danielcok17/prisma-db').appPrismaSchemaPath)")
npx prisma studio --schema "$APP_SCHEMA"
解决问题
- 缺少客户类型/运行时间:运行
npx prisma generate --schema "$(node -e "console.log(require('@danielcok17/prisma-db').appPrismaSchemaPath)")"。 。 。 . - 迁移部署失败: 校验 env vars 和 DB 连接; 确保
app计划存在. - 只读访问法律表格:使用用户/作用,只使用 SELECT 权限
POSTGRES_PRISMA_URL_LAW。 。 。 .