Drizzle | 외래 키가 있는 부분적으로 노출된 테이블 시딩하기
PostgreSQL
MySQL
SQLite
This guide assumes familiarity with:

예제 1: 외래 키가 있는 부분적으로 노출된 테이블 시딩하기

아래와 같은 시딩 스크립트와 스키마를 사용해 데이터베이스에 데이터를 채우려고 한다고 가정해 보겠습니다.

index.ts
schema.ts
import { bloodPressure } from './schema.ts';

async function main() {
  const db = drizzle(...);
  await seed(db, { bloodPressure });
}
main();

bloodPressure 테이블의 userId 컬럼에 not null 제약 조건이 있다면, 시딩 스크립트를 실행할 때 다음과 같은 오류가 발생합니다.

Error: 'userId' 컬럼에 not null 제약 조건이 있지만, 
'bloodPressure' 테이블의 'userId' 컬럼에 대한 외래 키 테이블을 지정하지 않았습니다.
이것이 무엇을 의미하나요?

이 오류는 userId 컬럼에 not null 제약 조건이 있기 때문에 Null 값을 채울 수 없음을 의미합니다. 또한, seed 함수 스키마에 users 테이블을 노출하지 않았기 때문에 users.id 값을 생성하여 userId 컬럼을 채울 수 없습니다.

이 문제를 해결하기 위해 다음과 같은 방법을 고려할 수 있습니다:

await seed(db, { bloodPressure, users });

예제 2

index.ts
schema.ts
import { bloodPressure } from './schema.ts';

async function main() {
  const db = drizzle(...);
  await seed(db, { bloodPressure });
}
main();

위의 시딩 스크립트를 실행하면 다음과 같은 경고가 표시됩니다.

'bloodPressure' 테이블의 'userId' 컬럼은 Null 값으로 채워질 것입니다.
왜냐하면 'userId' 컬럼에 대한 외래 키 테이블을 지정하지 않았고,
'refinements'에서 'userId' 컬럼에 대한 함수도 제공하지 않았기 때문입니다.
이것이 무엇을 의미하나요?

이는 seed 함수 스키마에 users 테이블을 제공하지 않았거나, userId 컬럼 생성기를 구체화하지 않았음을 의미합니다.
결과적으로 userId 컬럼은 Null 값으로 채워질 것입니다.

이제 두 가지 선택지가 있습니다:

userId 컬럼 생성기 개선하기

이 작업을 수행하려면 데이터베이스의 users 테이블에 이미 1과 2 같은 ID가 존재해야 합니다.

index.ts
import { bloodPressure } from './schema.ts';

async function main() {
  const db = drizzle(...);
  await seed(db, { bloodPressure }).refine((funcs) => ({
    bloodPressure: {
      columns: {
        userId: funcs.valuesFromArray({ values: [1, 2] })
      }
    }
  }));
}
main();