版本控制

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
使用版本 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 seconds` 和 `2 minutes 0 seconds` 之类的时间间隔,并将它们视为不同的间隔。然而,当 `1 minute 60 seconds` 间隔插入到 PostgreSQL 数据库中时,它会自动转换为 `2 minutes 0 seconds`。因此,此后尝试将 `2 minutes 0 seconds` 间隔插入到唯一列中将导致错误。

如果您的表包含类型为 `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();