使用种子文件将 JSON 文件中的数据添加到 Prisma 数据库
Add data from a JSON file to the Prisma database with a seed file
我想用 JSON 文件
中的一些数据作为我的数据库的种子
//continent-data.json
[
{
"continent": "far east",
"imageURL": "#"
},
{
"continent": "ASIA",
"imageURL": "#"
},
]
这是我的 seed.js 文件
//seed.js
const dotenv = require('dotenv');
const { Prisma } = require('./src/generated/prisma-client');
const continentData = require('./continent-data.json');
dotenv.config();
const db = new Prisma({
secret: process.env.PRISMA_SECRET,
endpoint: process.env.PRISMA_ENDPOINT
});
const seedContinents = () => {
// adding continents to the data
Promise.all(
continentData.map(async continentItem => {
const { imageURL, continent } = continentItem;
const response = await db.createContinent({
data: {
name: continent || 'default name',
imageURL,
}
});
return response;
})
);
};
seedContinents();
当我运行node seed.js
它失败并抛出以下错误
UnhandledPromiseRejectionWarning:错误:变量“$data”期望值类型为 'ContinentCreateInput!' 但得到:{"data":{"name":"far east","imageURL":"#","destinations":[]}}。原因:'name' 应为非空值,但发现为空值。
我相信我正在以正确的格式传递正确的数据。但它说名称字段有一个空值。但是错误消息本身说名称字段有一个字符串值 "far east"
我也提供了 Prisma 架构的必要部分。
尝试更改向 db.createContinent 函数提供数据的方式。
const response = await db.createContinent({
name: continent || 'default name',
imageURL,
});
只是传递数据而不是创建包装数据对象。
您可以将您在顶部导入的 Prisma 对象(Prisma 客户端)视为助手 class。在你实例化它之后,你就可以访问 javascript 函数,这些函数主要反映了根据你的 datamodel.graphql
文件为你生成的 Prisma Server CRUD 函数。
如果您查看 Prisma 客户端页面上的示例文档,您会发现有两种方法可以 pass data to get the same result。一方面,您可以调用 javascript 函数:
db.createContinent({
name: continent || 'default name',
imageURL,
});
另一方面,您可以在 Prisma 端点上直接 运行 GraphQL 查询,
mutation {
createContinent(data: {
name: continent || 'default name',
imageURL
}) {
name
continent
}
}
您可以在 GraphQL playground 中执行的第二种方法是直接与数据交互。第一个使用 Prisma 客户端自动生成的 javascript 函数的示例是一个包装器,只需要输入数据而不需要数据:对象包装器。所以没有
data: { { ContinentCreateInput object shape }}
文档并没有真正详细地介绍它,我花了一段时间也想知道为什么它不适合您在 GraphQL 类型中指定的形状。
第一种方法是从原始数据库 CRUD 方法中抽象出来并保护您的应用程序层的推荐方法。参见 Prisma client
我想用 JSON 文件
中的一些数据作为我的数据库的种子//continent-data.json
[
{
"continent": "far east",
"imageURL": "#"
},
{
"continent": "ASIA",
"imageURL": "#"
},
]
这是我的 seed.js 文件
//seed.js
const dotenv = require('dotenv');
const { Prisma } = require('./src/generated/prisma-client');
const continentData = require('./continent-data.json');
dotenv.config();
const db = new Prisma({
secret: process.env.PRISMA_SECRET,
endpoint: process.env.PRISMA_ENDPOINT
});
const seedContinents = () => {
// adding continents to the data
Promise.all(
continentData.map(async continentItem => {
const { imageURL, continent } = continentItem;
const response = await db.createContinent({
data: {
name: continent || 'default name',
imageURL,
}
});
return response;
})
);
};
seedContinents();
当我运行node seed.js
它失败并抛出以下错误
UnhandledPromiseRejectionWarning:错误:变量“$data”期望值类型为 'ContinentCreateInput!' 但得到:{"data":{"name":"far east","imageURL":"#","destinations":[]}}。原因:'name' 应为非空值,但发现为空值。
我相信我正在以正确的格式传递正确的数据。但它说名称字段有一个空值。但是错误消息本身说名称字段有一个字符串值 "far east"
我也提供了 Prisma 架构的必要部分。
尝试更改向 db.createContinent 函数提供数据的方式。
const response = await db.createContinent({
name: continent || 'default name',
imageURL,
});
只是传递数据而不是创建包装数据对象。
您可以将您在顶部导入的 Prisma 对象(Prisma 客户端)视为助手 class。在你实例化它之后,你就可以访问 javascript 函数,这些函数主要反映了根据你的 datamodel.graphql
文件为你生成的 Prisma Server CRUD 函数。
如果您查看 Prisma 客户端页面上的示例文档,您会发现有两种方法可以 pass data to get the same result。一方面,您可以调用 javascript 函数:
db.createContinent({
name: continent || 'default name',
imageURL,
});
另一方面,您可以在 Prisma 端点上直接 运行 GraphQL 查询,
mutation {
createContinent(data: {
name: continent || 'default name',
imageURL
}) {
name
continent
}
}
您可以在 GraphQL playground 中执行的第二种方法是直接与数据交互。第一个使用 Prisma 客户端自动生成的 javascript 函数的示例是一个包装器,只需要输入数据而不需要数据:对象包装器。所以没有
data: { { ContinentCreateInput object shape }}
文档并没有真正详细地介绍它,我花了一段时间也想知道为什么它不适合您在 GraphQL 类型中指定的形状。
第一种方法是从原始数据库 CRUD 方法中抽象出来并保护您的应用程序层的推荐方法。参见 Prisma client