마이그레이션 스크립트
가장 좋은 방법은 그래서 하나 개의 HTTP 요청이 GraphQL 백엔드로 전송됩니다 multiple mutations을 결합하여 마이그레이션 스크립트를 사용하는 참이다.
type Image {
id: ID!
name: String!
}
우리는 GraphQL 별칭으로 하나 개의 요청에 동일한 돌연변이 여러 번 포함 할 수 있습니다 : 우리는 우리의 마이그레이션 스크립트에서이 메커니즘을 활용할 수 있습니다
mutation {
first: updateImage(id: "first-id", name: "01_lg.jpg") {
id
name
}
second: updateImage(id: "second-id", name: "02_lg.jpg") {
id
name
}
}
이 스키마를 고려하십시오.
Lokka과 Node로 설명 하겠지만 원하는 언어와 GraphQL 클라이언트를 선택할 수 있습니다.
const queryImages = async() => {
const result = await client.query(`{
images: allImages {
id
name
}
}`)
return result.images
}
그런 다음 우리가 따라 이름을 교체하고 각각에 대해 서로 다른 GraphQL 별명 필요한
updateImage
돌연변이를 포함하는 하나 개의 큰 요청을 구성 :
첫째, 우리는 id
및 name
그들의 얻기 위해 기존의 모든 이미지를 쿼리합니다.
질문에 언급 된 부분 sm
의 이미지 이름에 {someid}
부분이 포함되어 있으면이 스크립트가 중단됩니다!이 경우 적절하게 조정하십시오.
const migrateImages = async(images) => {
// beware! if your ids contain the string 'sm', adjust the string replacement accordingly!
const updateMutations = _.chain(images)
.map(image => ({ id: image.id, name: image.name.replace('sm', 'lg')}))
.map(image => `
${image.id}: updateImage(id: "${image.id}", name: "${image.name}") {
id
name
}`)
.value()
.join('\n')
const result = await client.mutate(`{
${updateMutations}
}`)
console.log(`Updated ${Object.keys(result).length} images`)
console.log(result)
}
그게 전부입니다. 수천 개의 이미지를 업데이트해야한다면 100 개 그룹의 돌연변이를 일괄 적으로 배치하는 것이 한 요청에서 모든 것을 일괄 처리하는 것보다 낫습니다. GraphQL 서버의 mutations run sequentially에 유의하십시오.
마이그레이션되었는지 확인
- 복제 프로젝트
- 실행하여 복제 프로젝트 마이그레이션 스크립트 : 현재 마이그레이션
실행
는 , 나는 마이그레이션을 실행하기 위해 다음과 같은 워크 플로우를 제안 성공적으로 실행되었습니다. 더블 체크 :
- 원래 프로젝트
에 마이그레이션을 실행 당신은 코드와 추가 지침 here을 찾을 수 있습니다.
이 방법은 예제와 같이 간단하지만 모든 상황에 완벽하지는 않습니다. 우리는 이미 Graphcool 프로젝트의 인터랙티브 한 마이그레이션, 시뮬레이션 된 마이그레이션, 점검 등을 통해이 사용 사례에 대한 통합 된 경험을 창출하려고합니다. 제안 사항이 있으시면 Slack으로 알려 주시기 바랍니다.
'전체 목록을 통해 중재 '- 지금은 꽤 많이 가고 있습니다. 나는 당신이 염두에두고있는 것에 대한 기능 요청을 추가했다 : https://github.com/graphcool/feature-requests/issues/67 스크립트 설정에 도움을 줄 수있다. – marktani