版本控制

drizzle-seed 使用版本控制来管理静态和动态数据的输出。为确保真正的确定性,请确保在使用相同的 seed 编号时值保持不变。如果对静态数据源或动态数据生成逻辑进行更改,版本将会更新,这样您可以选择坚持使用以前的版本或使用最新版本。

您可以升级到最新的 drizzle-seed 版本以获得新功能,例如额外的生成器,同时在需要时保持确定性输出的旧版本。这在您需要依赖现有确定性数据同时访问新功能时特别有用。

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

历史

api versionnpm versionChanged generators
v10.1.1
v20.2.1string(), interval({ isUnique: true })
v30.4.0hash generating function
v4 (LTS) 1.0.0-beta.8uuid

底层工作原理?

这不是实际的 API 更改;这只是我们如何进行 drizzle-seed 版本控制的一个示例。

例如,lastName 生成器发生了变化,新的版本 V2 的此生成器可用。

后来,firstName 生成器发生了改变,生成了此生成器的 V3 版本。

V1V2V3(最新)
LastNameGenLastNameGenV1LastNameGenV2
FirstNameGenFirstNameGenV1FirstNameGenV3
使用版本 3 的 firstName 生成器和版本 2 的 lastName 生成器
await seed(db, schema);

如果您尚未准备好立即使用最新的生成器版本,可以指定最大使用版本

使用版本 1 的 firstName 生成器和版本 2 的 lastName 生成器
await seed(db, schema, { version: '2' });
使用版本 1 的 firstName 生成器和版本 1 的 lastName 生成器。
await seed(db, schema, { version: '1' });

版本 2

唯一的 interval 生成器已更改

升级原因

较旧版本的生成器可能生成类似 1 minute 60 seconds2 minutes 0 seconds 的间隔,将它们视为不同的间隔。 然而,当将 1 minute 60 seconds 间隔插入到 PostgreSQL 数据库时,它会自动转换为 2 minutes 0 seconds。因此,在之后尝试将 2 minutes 0 seconds 间隔插入唯一列将会导致错误。

如果你的表包含一个类型为 interval 的唯一列,你将会受到影响:

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 生成器,你将会受到影响,如下所示:

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)

如果你的表包含一个带有最大长度参数的类文本类型列,或者一个类文本类型的唯一列,你将会受到影响:

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 生成器,你将会受到影响,如下所示:

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();

版本 3

哈希生成函数已更改

升级原因

之前版本的哈希生成函数会根据使用的是 Bun 还是 Node.js 生成不同的哈希,而且哈希在不同版本的 Node.js 之间也会有所不同。

新的哈希生成函数无论 Node.js 或 Bun 的版本如何,都会生成相同的哈希,从而在所有版本中实现确定性的数据生成。

与之前的版本相比,所有生成器都会输出不同的值,即使使用相同的种子编号也是如此。

用法

await seed(db, schema);
// 或显式指定
await seed(db, schema, { version: '3' });

切换到旧版本

之前版本的哈希生成函数是 v1。

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

要在保持 v1 哈希生成函数的同时使用 v2 生成器:

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

版本 4

uuid 生成器已更改

升级原因

旧版本的 uuid 生成器生成的 UUID 值无法通过 Zod 的 v4 UUID 校验。

example

import { createSelectSchema } from 'drizzle-zod';
import { seed } from 'drizzle-seed';

await seed(db, { uuidTest: schema.uuidTest }, { count: 1 }).refine((funcs) => ({
		uuidTest: {
			columns: {
				col1: funcs.uuid()
			}
		}
	})
);

const uuidSelectSchema = createSelectSchema(schema.uuidTest);
const res = await db.select().from(schema.uuidTest);
// 下面这一行在使用旧版本的 uuid 生成器时将抛出错误
uuidSelectSchema.parse(res[0]);

用法

await seed(db, schema);
// 或显式指定
await seed(db, schema, { version: '4' });

切换到旧版本

uuid 生成器的前一个版本是 v1。

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

要在保留 v1 uuid 生成器的同时使用 v2 生成器:

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

要在保留 v1 uuid 生成器的同时使用 v3 生成器:

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