如何将SQL Server输出的JSON转为Prisma可用的TypeScript格式?
解决SQL Server导出数据适配Prisma Client TypeScript格式的问题
核心需求拆解
需要将SQL Server表数据转换为键无引号、字符串值用单引号的TypeScript对象格式,替代FOR JSON AUTO生成的标准JSON格式,用于Prisma的seed脚本。直接全局替换引号会破坏数据结构,需精准处理不同类型内容。
方法1:Node.js脚本精准正则替换
通过两步正则替换,分别处理对象键和字符串值,同时保留数字、null等非字符串类型的原始格式,还能处理字符串中的单引号转义。
示例脚本
const fs = require('fs'); // 读取SQL导出的JSON文件 const rawJson = fs.readFileSync('./sql-output.json', 'utf8'); // 步骤1:移除对象键的双引号(匹配"键名": 格式) let tsFormat = rawJson.replace(/"(\w+)"\s*:/g, '$1:'); // 步骤2:将字符串值的双引号替换为单引号,同时处理转义 tsFormat = tsFormat.replace(/:\s*"([^"]*)"/g, (match, value) => { // 跳过null、数字等非字符串值 if (value === 'null' || !isNaN(Number(value))) { return match; } // 处理字符串中的单引号转义,以及JSON中的转义双引号 const escapedValue = value.replace(/'/g, "\\'").replace(/\\"/g, '"'); return `: '${escapedValue}'`; }); // 写入可直接导入seed.ts的数据文件 fs.writeFileSync('./prisma-seed-data.ts', `export const userData = ${tsFormat};`);
使用说明
- 用
SELECT ... FOR JSON AUTO,INCLUDE_NULL_VALUES导出JSON到sql-output.json - 运行上述脚本生成
prisma-seed-data.ts - 在seed.ts中导入使用:
import { PrismaClient } from '@prisma/client'; import { userData } from './prisma-seed-data'; const prisma = new PrismaClient(); async function main() { await prisma.user.createMany({ data: userData }); } main() .catch(e => console.error(e)) .finally(async () => await prisma.$disconnect());
方法2:SQL直接生成TS格式字符串
跳过JSON转换步骤,用SQL的字符串拼接函数直接生成符合要求的TypeScript代码,避免后续处理。
示例SQL(以Users表为例)
SELECT '[' + STRING_AGG( CONCAT( '{ Id: ', Id, ', ', 'Name: ''', REPLACE(Name, '''', '\'''), ''', ', 'Description: ', IIF(Description IS NULL, 'null', '''' + REPLACE(Description, '''', '\''') + ''''), ', ', 'Age: ', Age, ' }' ), ', ' + CHAR(10) -- 添加换行,让输出更易读 ) + ']' AS PrismaSeedData FROM Users;
关键处理点
- 用
REPLACE(col, '''', '\''')处理字符串中的单引号,转义为TS支持的\' - 用
IIF判断null值,直接输出null而非字符串 STRING_AGG拼接所有行对象为数组格式,CHAR(10)添加换行优化可读性
执行后直接复制查询结果到seed.ts的data数组中即可。
方法3:命令行工具组合转换(jq+sed)
如果习惯用命令行处理,可以用jq解析JSON,再用sed调整格式:
# 从sql-output.json生成TS格式数组 jq -r '.[] | "{ Id: \( .Id ), Name: '\''\( .Name | gsub("\''"; "\\\''") )'\'', Description: \( .Description // "null" ), Age: \( .Age ) }"' sql-output.json | sed 's/^/ /' | awk 'BEGIN{print "["} {print $0 ","} END{print "]"}' > seed-data.txt
执行后将seed-data.txt的内容复制到seed.ts即可。
内容的提问来源于stack exchange,提问作者DennisT
相关产品推荐
相关产品推荐

