使用种子文件将数据从JSON文件添加到Prisma数据库

时间:2019-01-29 08:07:08

标签: graphql prisma

我想用来自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:错误:类型为'ContinentCreateInput!'的变量'$ data'期望值!但得到:{“数据”:{“名称”:“远东”,“ imageURL”:“#”,“目的地”:[]}}。原因:“名称”预期为非空值,找到为空。

我认为我以正确的格式传递了正确的数据。但是它说名称字段为空值。但是错误消息本身说name字段有一个字符串值“ far east”

我还提供了Prisma模式的必要部分。

enter image description here

2 个答案:

答案 0 :(得分:4)

尝试更改将数据提供给db.createContinent函数的方式。

 const response = await db.createContinent({
          name: continent || 'default name',
          imageURL,
      });

仅传递数据,而不创建包装数据对象。

答案 1 :(得分:0)

您可以想到您在顶部导入的Prisma对象(Prisma客户端)作为辅助类。实例化之后,您就可以访问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游乐场中完成的第二种方法,它是直接与数据进行交互。使用Prisma客户端自动生成的javascript函数的第一个示例是包装器,仅需要输入数据,而无需使用data:object包装器。因此,没有

data: { { ContinentCreateInput object shape }}

文档并没有真正详细介绍它,花了我一段时间才想知道为什么它不适合您在GraphQL类型中指定的形状。

第一种方法是推荐的方法,它可以从原始数据库CRUD方法中抽象出来并保护您的应用程序层。参见Prisma client