如何使用Prisma、Remix与Fly为生产数据库执行数据填充?
解决Fly实例上Prisma Seed执行失败的问题
核心原因
Fly生产环境默认仅安装dependencies中的包,devDependencies里的tsx、ts-node、typescript会被跳过;即使手动移到dependencies,实例环境也可能缺少TS运行所需的配置或路径映射,导致执行失败。
可行解决方案
方案1:预编译Seed脚本为JS(推荐)
这是最稳定的生产环境方案,避免在实例上处理TS编译:
- 修改tsconfig.json,确保prisma目录的TS文件被包含在编译范围内:
{ "include": ["app/**/*", "prisma/**/*"] } - 编译Seed脚本:执行项目的编译命令(比如Remix默认的
npm run build),确保prisma/seed.ts被编译到dist/prisma/seed.js(具体路径根据你的tsconfig输出目录调整)。 - 更新package.json中的Prisma配置:将seed命令指向编译后的JS文件:
{ "prisma": { "seed": "node dist/prisma/seed.js" } } - 重新部署到Fly:确保部署过程中执行了编译步骤(Fly的默认Remix部署流程会自动执行
npm run build),之后SSH到实例执行npx prisma db seed即可。
方案2:临时在实例上安装完整依赖执行
适合一次性seed操作,不修改项目配置:
- SSH连接到Fly实例后,先安装所有依赖(包括dev):
npm install - 再执行seed命令:
或者直接用npx拉取tsx执行,跳过本地安装:npx prisma db seednpx tsx@latest prisma/seed.ts
方案3:修改Fly部署配置临时安装Dev依赖(不推荐)
仅用于测试,会增大生产镜像体积:
在fly.toml中添加构建参数,强制安装dev依赖:
[build.args] NODE_ENV = "development"
重新部署后,实例会包含所有dev依赖,可直接执行npx prisma db seed。测试完成后记得改回NODE_ENV = "production"。
方案4:将Seed脚本改为JS格式
直接避免TS编译环节:
- 将
prisma/seed.ts重命名为prisma/seed.js,调整语法为JS(比如去掉类型注解等)。 - 更新package.json中的seed命令:
{ "prisma": { "seed": "node prisma/seed.js" } } - 重新部署后执行seed命令即可。
内容的提问来源于stack exchange,提问作者marcusps1
相关产品推荐
相关产品推荐

