Как импортировать CSV в sanity.io

Я программист-хобби, исследующий бесплатную версию новой безголовой системы CMS (www.sanity.io).

При попытке загрузить / импортировать данные в мой проект возникла проблема: есть ли способ импортировать данные из CSV-файла? Пример из документации объясняет только файлы json: https://www.sanity.io/docs/content-studio/importing-data

Вместо объяснения моего собственного проекта, позвольте мне использовать в качестве примера прилагаемую киностудию: скажем, что я хотел бы добавить слой информации о том, какая киностудия создавала фильмы. У меня есть файл CSV со списком студий, с колонками "Имя", "Страна", "Веб-страница", "Генеральный директор", "Фильмы". Где финал - это массив с названиями фильмов из этой студии. Я хотел бы импортировать этот CSV для создания нового типа контента, который представляет собой студию, где заполнен список студий и где массив фильмов - это ссылки, а не текст.

Может ли кто-нибудь помочь мне понять, как я должен делать удар?

1 ответ

Решение

В настоящее время нет способа импортировать данные непосредственно из файла CSV в Sanity. Тем не менее, достижение того, что вы хотите, довольно просто. Вкратце, это то, что вы хотите сделать:

  1. Разобрать CSV файл
  2. Структурируйте входящие данные в соответствии с вашей схемой
  3. Записывать новые документы в файл JSON с разделителями новой строки
  4. Импортируйте этот файл в Sanity

Скажите ваш CSV-файл с именем studios.csv выглядит примерно так:

NAME,WEBPAGE,MOVIES
Paramount,paramountstudios.com,Ghost in the Shell;Arrival
DreamWorks,dreamworksstudios.com,Ghost in the Shell;Minority Report;Transformers

В приведенном ниже коде используется csv-parser, но он все равно должен служить примером, если вы хотите использовать какой-то другой пакет для сожжения CSV.

const csv = require('csv-parser')
const fs = require('fs')
const sanityClient = require('@sanity/client')
const client = sanityClient({
  projectId: 'my-project-id',
  dataset: 'my-dataset',
  useCdn: false
})

function appendToFile(document) {
  const docAsNewLineJson = `${JSON.stringify(document)}\n`
  fs.appendFileSync('ready-for-import.ndjson', docAsNewLineJson, {flag: 'a+'})
}

function moviesByTitles(titles) {
  return client.fetch('*[_type == "movie" && title in $titles]', {titles: titles})
}

fs.createReadStream('studios.csv')
  .pipe(csv())
  .on('data', data => {
    // Assuming movie titles are semi-colon separated
    const titles = data.MOVIES.split(';')
    // Fetch movies with these titles 
    moviesByTitles(titles).then(movies => {
      // Build a Sanity document which matches your Studio type
      const document = {
        _type: 'studio',
        name: data.NAME,
        webPage: data.WEBPAGE,
        movies: movies.map(movie => {
          return {
            _ref: movie._id,
            _type: 'reference'
          }
        })
      }
      // Append the document to a file for later import
      appendToFile(document)  
    )}
  })

Вы получите файл ready-for-import.ndjson содержащие документы Sanity, готовые к импорту, теперь вы можете просто:

sanity dataset import ready-for-import.ndjson <my-dataset>

Может оказаться полезным включить _id поле с уникальным неслучайным значением в каждой студии, например studio_${data.NAME.toLowerCase().replace(' ', '-')}, Это позволит вам импортировать ваши документы несколько раз (используя --replace флаг), без получения дубликатов.

Другие вопросы по тегам