Skip to content

Conversation

@OleksiiKH0240
Copy link
Collaborator

@OleksiiKH0240 OleksiiKH0240 commented Mar 6, 2025

Bug fixes

Both the seed and reset functions didn't include LibSQLDatabase<any> in their generic type parameters.
As a result, the seed function accepts a db parameter like this:

import { drizzle } from "drizzle-orm/libsql";
import * as schema from "./schema.ts";

const db = drizzle({
  connection: {
    url: "",
    authToken: "",
  },
});

await seed(db, schema);

But it will reject a db parameter defined like this:

import { drizzle } from "drizzle-orm/libsql";
import * as schema from "./schema.ts";

const db = drizzle({
  schema,
  connection: {
    url: "",
    authToken: "",
  },
});

await seed(db, schema);

drizzle-seed misinterpreted realEstateTypeEnum enum as a real type.

Features

  • ignore column in refinements

Now you can let drizzle-seed know if you want to ignore column during seeding.

// schema.ts
import { integer, pgTable, text } from "drizzle-orm/pg-core";

export const users = pgTable("users", {
  id: integer().primaryKey(),
  name: text().notNull(),
  age: integer(),
  photo: text(),
});
// index.ts
import { drizzle } from "drizzle-orm/node-postgres";
import { seed } from "drizzle-seed";
import * as schema from "./schema.ts";

async function main() {
  const db = drizzle(process.env["DATABASE_URL"]!);
  await seed(db, schema).refine((f) => ({
    users: {
      count: 5,
      columns: {
        name: f.fullName(),
        photo: false, // the photo column will not be seeded, allowing the database to use its default value.
      },
    },
  }));
}

main();

Improvements

  • added minTime, maxTime parameters to time generator
await seed(db, { timeTable: schema.timeTable }).refine((funcs) => ({
  timeTable: {
    count,
    columns: {
      time: funcs.time({
        minTime: "13:12:13",
        maxTime: "15:12:13",
      }),
    },
  },
}));
  • added minTimestamp, maxTimestamp parameters to timestamp generator
await seed(db, { timestampTable: schema.timestampTable }).refine((funcs) => ({
  timestampTable: {
    count,
    columns: {
      timestamp: funcs.timestamp({
        minTimestamp: "2025-03-07 13:12:13.123Z",
        maxTimestamp: "2025-03-09 15:12:13.456Z",
      }),
    },
  },
}));
  • added minDatetime, maxDatetime parameters to datetime generator
await seed(db, { datetimeTable: schema.datetimeTable }).refine((funcs) => ({
  datetimeTable: {
    count,
    columns: {
      datetime: funcs.datetime({
        minDatetime: "2025-03-07 13:12:13Z",
        maxDatetime: "2025-03-09 15:12:13Z",
      }),
    },
  },
}));
  • exported AbstractGenerator so that users can build their own custom generator classes.

  • drizzle-seed now updates PostgreSQL sequences after seeding.

    drizzle-seed iterates through each column in a table, selects columns of type smallint, integer, bigint, smallserial, serial, or bigserial, and (if a sequence exists) updates it to the column’s maximum seeded value.

    select setval(pg_get_serial_sequence('"schema_name"."table_name"', 'column_name'), 3, true);

Breaking changes

uuid generator was changed and upgraded to v4

await seed(db, { table }).refine((f) => ({
  table: {
    columns: {
      // AA97B177-9383-4934-8543-0F91A7A02836
      //                    ^
      //                    1
      // the digit at position 1 is always one of '8', '9', 'A' or 'B'
      column1: f.uuid(),
    }
  }
}))

Reason for upgrade

UUID values generated by the old version of the uuid generator fail Zod’s v4 UUID validation.

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);
// the line below will throw an error when using old version of uuid generator
uuidSelectSchema.parse(res[0]);

Usage

await seed(db, schema);
// or explicit
await seed(db, schema, { version: '4' });

Switch to the old version

The previous version of uuid generator is v1.

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

To use the v2 generators while maintaining the v1 uuid generator:

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

To use the v3 generators while maintaining the v1 uuid generator:

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

updated tests for using these generators(+date generator) with parameters,
added feature to ignore column in refinements
@versecafe
Copy link

@OleksiiKH0240 is this still being considered and would the allow ignore column refine work if the column is an id column and you want to do a with that has other tables that depend on it as right now drizzle seed is unusable if you want to use with and have a column that's of a special type such as a text() that needs to be in a specific format due to a db check.

@OleksiiKH0240 OleksiiKH0240 changed the base branch from main to beta December 10, 2025 18:24
@AndriiSherman AndriiSherman merged commit 734e789 into beta Dec 31, 2025
63 of 64 checks passed
@AndriiSherman AndriiSherman deleted the drizzle-seed/bug-fixes branch December 31, 2025 16:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants