Как импортировать CSV в sanity.io
Я программист-хобби, исследующий бесплатную версию новой безголовой системы CMS (www.sanity.io).
При попытке загрузить / импортировать данные в мой проект возникла проблема: есть ли способ импортировать данные из CSV-файла? Пример из документации объясняет только файлы json: https://www.sanity.io/docs/content-studio/importing-data
Вместо объяснения моего собственного проекта, позвольте мне использовать в качестве примера прилагаемую киностудию: скажем, что я хотел бы добавить слой информации о том, какая киностудия создавала фильмы. У меня есть файл CSV со списком студий, с колонками "Имя", "Страна", "Веб-страница", "Генеральный директор", "Фильмы". Где финал - это массив с названиями фильмов из этой студии. Я хотел бы импортировать этот CSV для создания нового типа контента, который представляет собой студию, где заполнен список студий и где массив фильмов - это ссылки, а не текст.
Может ли кто-нибудь помочь мне понять, как я должен делать удар?
1 ответ
В настоящее время нет способа импортировать данные непосредственно из файла CSV в Sanity. Тем не менее, достижение того, что вы хотите, довольно просто. Вкратце, это то, что вы хотите сделать:
- Разобрать CSV файл
- Структурируйте входящие данные в соответствии с вашей схемой
- Записывать новые документы в файл JSON с разделителями новой строки
- Импортируйте этот файл в 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
флаг), без получения дубликатов.