Skip to content

Commit 1e7ea10

Browse files
authored
feat(drizzle): support schema parameter (#183)
1 parent f52a303 commit 1e7ea10

File tree

3 files changed

+104
-12
lines changed

3 files changed

+104
-12
lines changed

examples/drizzle/index.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,20 @@ export const users = sqliteTable("users", {
1010
name: text("full_name"),
1111
});
1212

13+
const schema = { users };
14+
1315
async function main() {
14-
const db = createDatabase(sqlite({}));
15-
const drizzleDb = drizzle(db);
16+
const db0 = createDatabase(sqlite({}));
17+
const db = drizzle(db0, { schema });
1618

17-
await db.sql`create table if not exists users (
19+
await db0.sql`create table if not exists users (
1820
id integer primary key autoincrement,
1921
full_name text
2022
)`;
2123

22-
await db.sql`insert into users (full_name) values ('John Doe')`;
24+
await db0.sql`insert into users (full_name) values ('John Doe')`;
2325

24-
const res = await drizzleDb.select().from(users).all();
26+
const res = await db.select().from(users).all();
2527
console.log({ res });
2628
}
2729

src/integrations/drizzle/index.ts

Lines changed: 43 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,59 @@
1+
import type { Database } from "db0";
2+
import { DB0Session, type DB0SessionOptions } from "./_session.ts";
3+
4+
import { DefaultLogger } from "drizzle-orm/logger";
5+
16
import {
27
BaseSQLiteDatabase,
38
SQLiteAsyncDialect,
49
} from "drizzle-orm/sqlite-core";
5-
import type { Database } from "db0";
6-
import { DB0Session } from "./_session.ts";
10+
11+
import {
12+
type DrizzleConfig as DrizzleBaseConfig,
13+
type RelationalSchemaConfig,
14+
type TablesRelationalConfig,
15+
createTableRelationsHelpers,
16+
extractTablesRelationalConfig,
17+
} from "drizzle-orm";
718

819
export type DrizzleDatabase<
920
TSchema extends Record<string, unknown> = Record<string, never>,
1021
> = BaseSQLiteDatabase<"async", any, TSchema>;
1122

23+
export type DrizzleConfig<
24+
TSchema extends Record<string, unknown> = Record<string, never>,
25+
> = DrizzleBaseConfig<TSchema>;
26+
1227
export function drizzle<
1328
TSchema extends Record<string, unknown> = Record<string, never>,
14-
>(db: Database): DrizzleDatabase<TSchema> {
15-
// TODO: Support schema
16-
const schema = undefined;
29+
>(db: Database, config?: DrizzleConfig<TSchema>): DrizzleDatabase<TSchema> {
30+
const dialect = new SQLiteAsyncDialect({ casing: config?.casing });
31+
32+
let logger: DB0SessionOptions["logger"];
33+
if (config?.logger === true) {
34+
logger = new DefaultLogger();
35+
} else if (config?.logger !== false && config?.logger !== undefined) {
36+
logger = config.logger;
37+
}
1738

18-
const dialect = new SQLiteAsyncDialect();
39+
// Transform user schema to RelationalSchemaConfig
40+
// Reference: https://github.com/drizzle-team/drizzle-orm/blob/main/drizzle-orm/src/d1/driver.ts
41+
let schema: RelationalSchemaConfig<TablesRelationalConfig> | undefined;
42+
if (config?.schema) {
43+
const tablesConfig = extractTablesRelationalConfig(
44+
config.schema,
45+
createTableRelationsHelpers,
46+
);
47+
schema = {
48+
fullSchema: config.schema,
49+
schema: tablesConfig.tables,
50+
tableNamesMap: tablesConfig.tableNamesMap,
51+
};
52+
}
1953

20-
const session = new DB0Session(db, dialect, schema);
54+
const session = new DB0Session(db, dialect, schema, {
55+
logger,
56+
});
2157

2258
return new BaseSQLiteDatabase(
2359
"async",

test/integrations/drizzle.test.ts

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,65 @@ describe("integrations: drizzle: better-sqlite3", () => {
4747
expect(res[0].name).toBe("John Doe");
4848
});
4949

50+
it("accepts boolean logger config", () => {
51+
expect(() => drizzle(db, { logger: true })).not.toThrow();
52+
});
53+
5054
afterAll(async () => {
5155
await db.sql`DROP TABLE IF EXISTS users`;
5256
});
5357
});
5458

59+
describe("integrations: drizzle: with schema parameter", () => {
60+
const users = dSqlite.sqliteTable("users_schema", {
61+
id: dSqlite.numeric("id"),
62+
name: dSqlite.text("name"),
63+
email: dSqlite.text("email"),
64+
});
65+
66+
const schema = { users };
67+
68+
let drizzleDb: DrizzleDatabase<typeof schema>;
69+
let db: Database;
70+
71+
beforeAll(async () => {
72+
db = createDatabase(sqliteConnector({}));
73+
drizzleDb = drizzle(db, { schema });
74+
await db.sql`DROP TABLE IF EXISTS users_schema`;
75+
await db.sql`create table if not exists users_schema (
76+
id integer primary key autoincrement,
77+
name text,
78+
email text
79+
)`;
80+
});
81+
82+
it("insert with schema", async () => {
83+
const res = await drizzleDb
84+
.insert(users)
85+
.values({
86+
name: "Jane Doe",
87+
88+
})
89+
.returning();
90+
91+
expect(res.length).toBe(1);
92+
expect(res[0].name).toBe("Jane Doe");
93+
expect(res[0].email).toBe("[email protected]");
94+
});
95+
96+
it("select with schema", async () => {
97+
const res = await drizzleDb.select().from(users).all();
98+
99+
expect(res.length).toBe(1);
100+
expect(res[0].name).toBe("Jane Doe");
101+
expect(res[0].email).toBe("[email protected]");
102+
});
103+
104+
afterAll(async () => {
105+
await db.sql`DROP TABLE IF EXISTS users_schema`;
106+
});
107+
});
108+
55109
describe.runIf(process.env.POSTGRESQL_URL)(
56110
"integrations: drizzle: postgres",
57111
() => {

0 commit comments

Comments
 (0)