版本控制
drizzle-seed 使用版本控制来管理静态和动态数据的输出。为了确保真正的
确定性,在使用相同的 seed 数字时,请确保值保持不变。如果对
静态数据源或动态数据生成逻辑进行了更改,版本将会更新,从而允许
你在沿用之前版本和使用最新版本之间进行选择。
你可以将 drizzle-seed 升级到最新版本以获取新功能,例如更多
生成器,同时在需要时仍可使用之前的版本来保持确定性的输出。这
在你需要依赖现有确定性数据,同时又想使用新功能时尤其有用。
await seed(db, schema, { version: '2' });
历史
| api version | npm version | Changed generators |
|---|
v1 | 0.1.1 | |
v2 | 0.2.1 | string(), interval({ isUnique: true }) |
v3 | 0.4.0 | hash generating function |
v4 (LTS) | 1.0.0-beta.8 | uuid |
这并不是实际的 API 变更;这只是一个示例,用于说明我们将如何推进 drizzle-seed 的版本管理。
例如,lastName 生成器发生了变化,这个生成器的新版本 V2 可用了。
后来,firstName 生成器也发生了变化,使得该生成器的 V3 版本可用。
| V1 | V2 | V3(latest) |
|---|
| LastNameGen | LastNameGenV1 | LastNameGenV2 | |
| FirstNameGen | FirstNameGenV1 | | FirstNameGenV3 |
使用 firstName 生成器的第 3 版和 lastName 生成器的第 2 版
await seed(db, schema);
如果你还没准备好立即使用最新版本的生成器,你可以指定要使用的最大版本
使用 firstName 生成器的第 1 版和 lastName 生成器的第 2 版
await seed(db, schema, { version: '2' });
使用 firstName 生成器的第 1 版和 lastName 生成器的第 1 版。
await seed(db, schema, { version: '1' });
版本 2
唯一 interval 生成器已更改
升级原因
旧版本的生成器可能会生成像 1 minute 60 seconds 和 2 minutes 0 seconds 这样的区间,并将它们视为不同的区间。
然而,当 1 minute 60 seconds 这个区间插入到 SingleStore 数据库时,它会自动转换为 2 minutes 0 seconds。因此,之后尝试将 2 minutes 0 seconds 区间插入唯一列时会报错
如果你在填充脚本中使用了唯一的 interval 生成器,就会受到影响,如下方脚本所示:
import { binary, char, singlestoreTable, text, varbinary, varchar } from 'drizzle-orm/singlestore-core';
import { drizzle } from 'drizzle-orm/singlestore';
import { seed } from "drizzle-seed";
const intervals = singlestoreTable('intervals', {
interval1: char({ length: 255 }).unique(),
interval2: char({ length: 255 }),
interval3: varchar({ length: 255 }).unique(),
interval4: varchar({ length: 255 }),
interval5: binary({ length: 255 }).unique(),
interval6: binary({ length: 255 }),
interval7: varbinary({ length: 255 }).unique(),
interval8: varbinary({ length: 255 }),
interval9: text(),
});
async function main() {
const db = drizzle(process.env.DATABASE_URL!);
await seed(db, { intervals }, { version: '2' }).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 }),
interval8: f.interval({ isUnique: true }),
interval9: f.interval({ isUnique: true }),
},
},
}));
}
main();
string 生成器已更改:包括非唯一和唯一两种情况
升级原因
能够基于文本列的长度生成唯一字符串(例如,varchar(20))
如果你的表包含一个具有最大长度参数的类文本类型列,或者一个类文本类型的唯一列,你将会受到影响:
import { binary, char, singlestoreTable, varbinary, varchar } from 'drizzle-orm/singlestore-core';
import { drizzle } from 'drizzle-orm/singlestore';
import { seed } from "drizzle-seed";
const strings = singlestoreTable('strings', {
string1: char({ length: 255 }).unique(),
string2: char({ length: 255 }),
string3: varchar({ length: 255 }).unique(),
string4: varchar({ length: 255 }),
string5: binary({ length: 255 }).unique(),
string6: binary({ length: 255 }),
string7: varbinary({ length: 255 }).unique(),
string8: varbinary({ length: 255 }),
});
async function main() {
const db = drizzle(process.env.DATABASE_URL!);
await seed(db, { strings });
}
main();
如果你在填充脚本中使用了 string 生成器,就会受到影响,如下方脚本所示:
import { binary, char, singlestoreTable, text, varbinary, varchar } from 'drizzle-orm/singlestore-core';
import { drizzle } from 'drizzle-orm/singlestore';
import { seed } from "drizzle-seed";
const strings = singlestoreTable('strings', {
string1: char({ length: 255 }).unique(),
string2: char({ length: 255 }),
string3: char({ length: 255 }),
string4: varchar({ length: 255 }).unique(),
string5: varchar({ length: 255 }),
string6: varchar({ length: 255 }),
string7: binary({ length: 255 }).unique(),
string8: binary({ length: 255 }),
string9: binary({ length: 255 }),
string10: varbinary({ length: 255 }).unique(),
string11: varbinary({ length: 255 }),
string12: varbinary({ length: 255 }),
string13: 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({ isUnique: true }),
string3: f.string(),
string4: f.string({ isUnique: true }),
string5: f.string({ isUnique: true }),
string6: f.string(),
string7: f.string({ isUnique: true }),
string8: f.string({ isUnique: true }),
string9: f.string(),
string10: f.string({ isUnique: true }),
string11: f.string({ isUnique: true }),
string12: f.string(),
string13: f.string({ isUnique: true }),
},
},
}));
}
main();
版本 3
hash generating function was changed
Reason to upgrade
之前版本的 hash 生成函数会根据使用的是 Bun 还是 Node.js 生成不同的 hash,而且 hash 也会因 Node.js 的版本不同而变化。
新的 hash 生成函数无论 Node.js 或 Bun 的版本如何,都会生成相同的 hash,从而在所有版本中实现确定性的数据生成。
所有生成器与 предыдущ版本相比都会输出不同的值,即使使用相同的种子数值也是如此。
用法
await seed(db, schema);
// 或显式指定
await seed(db, schema, { version: '3' });
切换到旧版本
之前版本的 hash 生成函数是 v1。
await seed(db, schema, { version: '1' });
要在保持 v1 hash 生成函数的同时使用 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' });