매우 구체적인 통합 테스트를 위해 많은 수의 개체가있는 테스트 DB를 채우려는 중 하나에서 쿼리의 반환 된 ID를 사용하는 데 문제가 있습니다. 후속의 오브젝트의 필드의 값WITH 절에 SQL 쿼리를 연결하여 결국 업데이트를 수행합니다.
-- create a user with an account with salesforce integration
WITH p AS (
INSERT INTO person (email, confirmed, first_name, last_name) VALUES
('[email protected]', TRUE, 'Salesforce', 'Guy')
RETURNING id
),
ac AS (
INSERT INTO account (subscription_type, subscription_expires_on, salesforce_integration) VALUES (0, '2024-10-10', TRUE)
RETURNING id
),
am AS (
INSERT INTO account_member (person_id, account_id, admin) VALUES
((SELECT p.id FROM p), (SELECT ac.id FROM ac), TRUE)
RETURNING account_id, person_id
),
la AS (
-- create a salesforce linked_account
INSERT INTO linked_account (person_id, provider_id, access_token) VALUES
((SELECT p.id FROM p), 'salesforce', '00DC00000016x37!AQIAQIt5EpCIgTFl9hg2qF9Ed6vzLJmTg9Nrd.uxvVva5WaxzMChn4sBBgV6KXiICCBoJgcFYbrTqpFtFJwpd.B7fe5kG9_z')
RETURNING id
),
v AS (
-- create a video and take
INSERT INTO video (person_id, account_id) VALUES
((SELECT p.id FROM p), (SELECT ac.id FROM ac))
RETURNING id
),
t AS (
INSERT INTO take (video_id, key, duration, state, thumbnail_selected) VALUES
((SELECT v.id FROM v), 'g1/g1546ad07eff44c397e356be7c4bea49/g1546ad07eff44c397e356be7c4bea49', 35, 2, 1)
RETURNING id
)
-- update video with selected take
UPDATE video SET selected_take_id = (SELECT id FROM take WHERE take.video_id=video.id);
나는 시험이 상태 실행시에 실행하고 문제가 하단에 질의하는 "선택 테이크와 업데이트 비디오"를 의미 나는 selected_take_id가 설정되어 있지 않습니다 생성 (V) 비디오, 실제로 작동하지 않았다.
이 스크립트가 실행될 때이 DB가 비어 있지 않다는 것을 알아 두어야합니다. 이렇게하기 전에 실행되는 2 개의 유사한 시드 파일이 있으므로 적어도 2 개의 비디오, 2 개의 테이크 등이 이미 db에 저장되어 있습니다. 누구든지 외래 키에 대한 값으로 정적 ID를 제공 할 필요없이이 작업을 수행하는 방법을 알고 있다면 시간이 많이 절약됩니다.
감사합니다.
관련 스키마를 제공 할 수 있습니까? 예 : http://sqlfiddle.com/? –
나는 그것을 알아 냈다. 그러나 읽는 데 시간을내어 줘서 고마워! –