Flow와 Report를 Client로 저장하기
용도
client.save(...)는 작성한 px.Flow 또는 px.Report를 이 Client가 연결한 Project에 저장하고 정확한 리비전의 FlowRef 또는 ReportRef를 반환합니다. 어느 Client가 저장·해석을 소유하는지가 호출 자리에서 명시됩니다.
문법
client.save(flow: object) -> FlowRef | ReportRef예제
client = px.Client(workspace="engineering", project="bridge")
flow_ref = client.save(flow)
report_ref = client.save(report)
report_ref.revision_ref매개변수
flow— 저장할px.Flow또는px.Report객체.
반환
px.Flow는 FlowRef, px.Report는 ReportRef를 반환합니다. 두 타입 모두 .revision_ref(supervisor가 저장한 exact revision 문자열)·키·workspace/project를 담고 to_dict()를 제공합니다.
규칙
px.Report를 저장하면 그 Report는 이 Client에 바인딩됩니다. 이후report.save(),report.plan_pages(),report.export_pdf(),report.preview_html()은 전부 이 Client로 말합니다.- Client 없이 부르는
report.save()는 convenience로 남습니다: 프로세스에 live Client가 정확히 하나일 때만 동작하고, 둘 이상이면 이름 있는 거부를 받습니다. - Flow 저장은
client.run과 같은 materialization을 실행 없이 수행합니다. 같은 bytes의 재저장은 새 revision을 만들지 않습니다.
Flow 저장의 성공·실패 경계
Flow와 그 Flow가 선언한 Project Function을 하나의 저장 요청으로 전달합니다. Runtime은 후보와 기존 사용 관계를 검증한 뒤 새 Function 버전, 영향받는 Flow·Report의 현재 참조, 저장할 Flow와 요청 처리 기록을 함께 확정합니다. 중간 검증이나 저장이 실패하면 그 요청의 일부 Function 변경만 남기지 않습니다.
이미 저장된 정확한 Flow 리비전을 다시 저장하면 해당 주소를 반환합니다. 이 동작은 최신 head를 과거 리비전으로 되돌리지 않습니다. Function 변경이 성공하면 기존의 현재 사용처 갱신 정책은 유지하고, 같은 저장에서 여러 Function이 사용하는 하나의 Flow·Report는 합쳐진 최종 리비전으로 한 번 갱신합니다.
응답을 받지 못해 저장 결과를 확인할 수 없을 때는 같은 Flow 객체와 같은 내용을 유지한 채 명시적으로 client.save(flow)를 다시 호출합니다. SDK가 처음 보낸 요청 식별자를 유지하므로 이미 완료된 저장을 다시 적용하지 않습니다. 결과가 미확정인 동안 내용을 바꾸거나 다른 Project로 저장하는 요청은 거절합니다. 객체를 폐기하거나 새 프로세스를 시작했을 때 SDK가 미확정 초안을 자동 복원하는 기능을 제공하는 것은 아닙니다.
client.run(flow, ...)의 저장 준비에도 같은 경계를 사용합니다. 저장과 이후 계산 제출은 별개이므로, 저장이 성공한 뒤 계산 요청이 거절되어도 저장된 Flow는 유지됩니다. 독립된 여러 client.save(...) 호출이나 연결된 Report의 후속 저장을 하나의 트랜잭션으로 묶는 API는 아닙니다.
이 저장 경로는 product.flow.materialize를 지원하는 Runtime과 짝이 맞는 SDK가 필요합니다. 원격 접속의 operation scope에도 이 작업이 명시적으로 허용되어야 합니다. SDK는 지원되지 않는 서버에서 이전의 부분 저장 호출로 자동 대체하지 않습니다.