Добавить данные из файла JSON в базу данных Prisma с помощью начального файла - PullRequest
0 голосов
/ 29 января 2019

Я хочу заполнить свою базу данных некоторыми данными из файла 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": "#", "destination": []}}.Причина: 'name' Ожидаемое ненулевое значение, найдено NULL.

Я считаю, что я передаю правильные данные в правильном формате.но это говорит, что поле имени получило нулевое значение.но само сообщение об ошибке говорит, что поле имени имеет строковое значение «Дальний Восток»

Я также предоставил необходимые части схемы Prisma.

enter image description here

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Вы можете представить объект Prisma (клиент Prisma), который вы импортировали вверху, как вспомогательный класс.После его создания вы получаете доступ к функциям javascript, которые в основном отражают функции CRUD Prisma Server, которые были сгенерированы для вас на основе вашего файла datamodel.graphql.

Если вы посмотрите на примеры документов на PrismaНа странице клиента вы можете видеть, что есть два способа передать данные, чтобы получить тот же результат .С одной стороны, вы можете вызвать функцию javascript:

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

А с другой стороны, вы можете напрямую выполнить запрос GraphQL на конечной точке Prisma,

mutation {
  createContinent(data: {
    name: continent || 'default name',
    imageURL
  }) {
    name
    continent
  }
} 

Второй способВы можете сделать это на игровой площадке GraphQL и напрямую взаимодействовать с данными.Первый пример, в котором используются автоматически сгенерированные функции javascript клиента Prisma, - это оболочка, для которой требуются только входные данные без data: object wrapper.Так что без

data: { { ContinentCreateInput object shape }}

Документы на самом деле не охватывают это подробно, и мне потребовалось некоторое время, чтобы подумать, почему он не соответствует форме, которую вы указали вваши типы GraphQL.

Первый способ - это рекомендуемый способ абстрагирования и защиты уровня вашего приложения от необработанных методов CRUD базы данных.См Prisma client

0 голосов
/ 29 января 2019

попробуйте изменить способ подачи данных в функцию db.createContinent.

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

просто передайте данные вместо создания объекта данных оболочки.

...