【问题标题】:Add data from a JSON file to the Prisma database with a seed file使用种子文件将数据从 JSON 文件添加到 Prisma 数据库
【发布时间】:2019-06-22 07:21:18
【问题描述】:

我想用 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”预期值但得到:{"data":{"name":"far east","imageURL":"#","destinations":[]}}。原因:'name' 预期的非空值,发现为空。

我相信我正在以正确的格式传递正确的数据。但它说名称字段有一个空值。但是错误消息本身说名称字段有一个字符串值“远东”

我也提供了 Prisma 架构的必要部分。

【问题讨论】:

    标签: graphql prisma


    【解决方案1】:

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

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

    只需传递数据而不是创建包装数据对象。

    【讨论】:

      【解决方案2】:

      您可以将在顶部导入的 Prisma 对象(Prisma 客户端)视为辅助类。在您实例化它之后,您就可以访问大部分反映 Prisma Server CRUD 函数的 javascript 函数,这些函数是根据您的 datamodel.graphql 文件为您生成的。

      如果您查看 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: { { ContinentCreateInput object shape }}

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-13
        • 1970-01-01
        • 2015-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多