目前还没有一种直接从CSV文件导入数据到Sanity的方法。但是,实现你想要的功能非常简单。简而言之,你需要做以下几个步骤:
- 解析CSV文件
- 将输入数据结构化以匹配你的模式
- 将新文档写入一个以换行符分隔的JSON文件中
- 将该文件导入到Sanity中
假设你的CSV文件名为
studios.csv
,看起来像这样:
NAME,WEBPAGE,MOVIES
Paramount,paramountstudios.com,Ghost in the Shell
DreamWorks,dreamworksstudios.com,Ghost in the Shell
下面的代码使用了
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 => {
const titles = data.MOVIES.split(';')
moviesByTitles(titles).then(movies => {
const document = {
_type: 'studio',
name: data.NAME,
webPage: data.WEBPAGE,
movies: movies.map(movie => {
return {
_ref: movie._id,
_type: 'reference'
}
})
}
appendToFile(document)
)}
})
您将得到文件
ready-for-import.ndjson
,其中包含准备好导入的Sanity文档,现在您可以简单地执行以下操作:
sanity dataset import ready-for-import.ndjson <my-dataset>
在每个工作室中包含一个具有唯一且非随机值的_id
字段可能会证明很有用,例如studio_${data.NAME.toLowerCase().replace(' ', '-')}
。这将允许您多次导入文档(使用--replace
标志),而不会出现重复。