버전 관리

drizzle-seed는 정적 데이터와 동적 데이터의 출력을 관리하기 위해 버전 관리를 사용합니다. 완전한 결정론적 결과를 보장하려면 동일한 seed 번호를 사용할 때 값이 변경되지 않도록 해야 합니다. 정적 데이터 소스나 동적 데이터 생성 로직을 변경하면 버전이 업데이트됩니다. 이를 통해 이전 버전을 유지하거나 최신 버전을 사용할 수 있습니다.

필요한 경우 새로운 기능(예: 추가 생성기)을 위해 최신 drizzle-seed 버전으로 업그레이드할 수 있습니다. 동시에 기존의 결정론적 데이터를 유지하면서 새로운 기능을 활용할 수 있습니다. 이는 기존 데이터에 의존하면서도 새로운 기능을 사용해야 할 때 특히 유용합니다.

await seed(db, schema, { version: '2' });

버전 히스토리

API 버전npm 버전변경된 생성기
v10.1.1
v2 (LTS)0.2.1string(), interval({ isUnique: true })

내부 동작 원리는 어떻게 되나요?

이는 실제 API 변경 사항이 아닙니다. drizzle-seed 버전 관리를 어떻게 진행할지 보여주는 예시일 뿐입니다.

예를 들어, lastName 생성기가 변경되어 새로운 버전인 V2가 제공되었습니다.

이후 firstName 생성기가 변경되면서 V3 버전이 제공되었습니다.

V1V2V3(최신)
LastNameGenLastNameGenV1LastNameGenV2
FirstNameGenFirstNameGenV1FirstNameGenV3
firstName 생성기는 버전 3, lastName 생성기는 버전 2 사용하기
await seed(db, schema);

최신 버전의 생성기를 바로 사용할 준비가 되지 않았다면, 사용할 최대 버전을 지정할 수 있습니다.

버전 1의 firstName 생성기와 버전 2의 lastName 생성기 사용하기
await seed(db, schema, { version: '2' });
firstName 생성기는 버전 1을, lastName 생성기는 버전 1을 사용하세요.
await seed(db, schema, { version: '1' });

Version 2

고유 interval 생성기가 변경되었습니다

업그레이드 이유

이전 버전의 생성기는 1분 60초2분 0초와 같은 간격을 생성할 수 있었고, 이를 서로 다른 간격으로 처리했습니다. 하지만 1분 60초 간격을 PostgreSQL 데이터베이스에 삽입하면 자동으로 2분 0초로 변환됩니다. 결과적으로, 이후에 2분 0초 간격을 고유 컬럼에 삽입하려고 하면 오류가 발생합니다.

여러분이 영향을 받는 경우는 테이블에 interval 타입의 고유 컬럼이 포함되어 있을 때입니다:

PostgreSQL
import { drizzle } from "drizzle-orm/node-postgres";
import { pgTable, interval } from "drizzle-orm/pg-core";
import { seed } from "drizzle-seed";

const intervals = pgTable("intervals", {
    interval: interval().unique()
});

async function main() {
  const db = drizzle(process.env.DATABASE_URL!);

  await seed(db, { intervals });
}

main();

여러분이 시딩 스크립트에서 고유 interval 생성기를 사용하는 경우에도 영향을 받습니다. 아래 스크립트와 같이 사용한 경우입니다:

PostgreSQL
MySQL
SQLite
import { drizzle } from "drizzle-orm/node-postgres";
import { pgTable, interval, char, varchar, text } from "drizzle-orm/pg-core";
import { seed } from "drizzle-seed";

const intervals = pgTable("intervals", {
    interval: interval().unique(),
    interval1: interval(),
    interval2: char({ length: 256 }).unique(),
    interval3: char({ length: 256 }),
    interval4: varchar().unique(),
    interval5: varchar(),
    interval6: text().unique(),
    interval7: text(),
});

async function main() {
  const db = drizzle(process.env.DATABASE_URL!);

  await seed(db, { intervals }).refine((f) => ({
    intervals: {
        columns: {
            interval: f.interval({ isUnique: true }),
            interval1: f.interval({ isUnique: true }),
            interval2: f.interval({ isUnique: true }),
            interval3: f.interval({ isUnique: true }),
            interval4: f.interval({ isUnique: true }),
            interval5: f.interval({ isUnique: true }),
            interval6: f.interval({ isUnique: true }),
            interval7: f.interval({ isUnique: true }),
        }
    }
  }));
}

main();

string 생성자가 변경됨: 중복 가능 및 중복 불가능 문자열 모두

업그레이드 이유

텍스트 컬럼의 길이를 기반으로 고유한 문자열을 생성할 수 있는 기능 (예: varchar(20))

다음과 같은 경우 영향을 받습니다:

PostgreSQL
MySQL
SQLite
import { drizzle } from "drizzle-orm/node-postgres";
import { pgTable, char, varchar, text } from "drizzle-orm/pg-core";
import { seed } from "drizzle-seed";

const strings = pgTable("strings", {
    string2: char({ length: 256 }).unique(),
    string3: char({ length: 256 }),
    string4: varchar().unique(),
    string5: varchar({ length: 256 }).unique(),
    string6: varchar({ length: 256 }),
    string7: text().unique(),
});

async function main() {
  const db = drizzle(process.env.DATABASE_URL!);

  await seed(db, { strings });
}

main();

시딩 스크립트에서 string 생성자를 사용하는 경우에도 영향을 받습니다. 아래 스크립트를 참고하세요:

PostgreSQL
MySQL
SQLite
import { drizzle } from "drizzle-orm/node-postgres";
import { pgTable, char, varchar, text } from "drizzle-orm/pg-core";
import { seed } from "drizzle-seed";

const strings = pgTable("strings", {
    string1: char({ length: 256 }).unique(),
    string2: char({ length: 256 }),
    string3: char({ length: 256 }),
    string4: varchar(),
    string5: varchar().unique(),
    string6: varchar({ length: 256 }).unique(),
    string7: varchar({ length: 256 }),
    string8: varchar({ length: 256 }),
    string9: text().unique(),
    string10: text(),
});

async function main() {
  const db = drizzle(process.env.DATABASE_URL!);

  await seed(db, { strings }).refine((f) => ({
    strings: {
        columns: {
            string1: f.string({ isUnique: true }),
            string2: f.string(),
            string3: f.string({ isUnique: true }),
            string4: f.string({ isUnique: true }),
            string5: f.string({ isUnique: true }),
            string6: f.string({ isUnique: true }),
            string7: f.string(),
            string8: f.string({ isUnique: true }),
            string9: f.string({ isUnique: true }),
            string10: f.string({ isUnique: true }),
        }
    }
  }));
}

main();