使用Prisma执行CSV数据库种子命令时遇语法错误,如何解决?
问题原因
PostgreSQL的COPY命令不支持用参数绑定指定文件路径,Prisma的$executeRaw会把你插值的${accountSeedFile}转换成SQL参数(也就是报错里的$1),这不符合PostgreSQL的语法规则,因此触发42601语法错误。
解决方案
由于种子文件是你自行维护的可信文件,不存在SQL注入风险,可以直接用模板字符串拼接路径,同时改用$executeRawUnsafe执行($executeRaw会强制参数化,无法满足直接拼接路径的需求):
const accountSeedFile = join(process.cwd(), './prisma/seeds/accounts.csv'); const accountSeedPromise = prisma.$executeRawUnsafe(` COPY "accounts"(id, name, bank) FROM '${accountSeedFile}' DELIMITER ',' CSV HEADER; `); const [accountsResult] = await Promise.all([accountSeedPromise]);
另外需要确保PostgreSQL服务进程拥有读取该种子文件的权限,本地开发环境一般无此问题;若为生产环境,建议将文件放在PostgreSQL可访问的目录下,或改用COPY FROM STDIN通过数据流导入数据。
内容的提问来源于stack exchange,提问作者Sadraque Santos
相关产品推荐
相关产品推荐

