2017-01-17 2 views
2

저는 Graph.cool graphql을 서비스로 사용하고 있으며 SQL 업데이트와 마찬가지로 컬렉션을 대량 업데이트하는 방법을 알고 있습니다.그래프를 사용하여 컬렉션의 모든 레코드를 업데이트하는 방법

내 경우에는 데이터베이스의 imageUrl 열에서 URL의 접미사를 업데이트해야합니다. {someid} _sm.jpg를 {someid}와 (과) 교환해야합니다. _lg.jpg

graphql 돌연변이로 어떻게 처리 할 수 ​​있습니까? 전체 데이터 집합을 다시로드하고 싶지 않고 graphql 클라이언트로 전체 목록을 수동으로 개입시키지 않는 방법을 찾고 있습니다.

mutation { 
    updatePost() // what goes here? 
} 
+2

'전체 목록을 통해 중재 '- 지금은 꽤 많이 가고 있습니다. 나는 당신이 염두에두고있는 것에 대한 기능 요청을 추가했다 : https://github.com/graphcool/feature-requests/issues/67 스크립트 설정에 도움을 줄 수있다. – marktani

답변

2

마이그레이션 스크립트

가장 좋은 방법은 그래서 하나 개의 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 돌연변이를 포함하는 하나 개의 큰 요청을 구성 :

첫째, 우리는 idname 그들의 얻기 위해 기존의 모든 이미지를 쿼리합니다.

질문에 언급 된 부분 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으로 알려 주시기 바랍니다.

  • 관련 문제