Skip to content

Commit f5ce5c0

Browse files
committed
Fixed missing bun drivers from kit, fixed lack of subquery procession in cockroach, mssql sessions, fixed broken test cases
1 parent 050dff2 commit f5ce5c0

File tree

6 files changed

+270
-31
lines changed

6 files changed

+270
-31
lines changed

drizzle-kit/src/cli/connections.ts

Lines changed: 210 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ export const preparePostgresDB = async (
4444
| 'pg'
4545
| 'postgres'
4646
| '@vercel/postgres'
47-
| '@neondatabase/serverless';
47+
| '@neondatabase/serverless'
48+
| 'bun';
4849
proxy: Proxy;
4950
transactionProxy: TransactionProxy;
5051
migrate: (config: string | MigrationConfig) => Promise<void | MigratorInitFailResponse>;
@@ -559,8 +560,64 @@ export const preparePostgresDB = async (
559560
return { packageName: '@neondatabase/serverless', query, proxy, transactionProxy, migrate: migrateFn };
560561
}
561562

563+
if (await checkPackage('bun')) {
564+
console.log(withStyle.info(`Using 'bun' driver for database querying`));
565+
const { SQL } = await import('bun');
566+
const { drizzle } = await import('drizzle-orm/bun-sql');
567+
const { migrate } = await import('drizzle-orm/bun-sql/migrator');
568+
569+
const ssl = 'ssl' in credentials
570+
? credentials.ssl === 'prefer'
571+
|| credentials.ssl === 'require'
572+
|| credentials.ssl === 'allow'
573+
? true
574+
: false
575+
: undefined;
576+
577+
const client = new SQL({
578+
adapter: 'postgres',
579+
...credentials,
580+
ssl,
581+
max: 1,
582+
});
583+
const db = drizzle({ client });
584+
const migrateFn = async (config: MigrationConfig) => {
585+
return migrate(db, config);
586+
};
587+
588+
const query = async (sql: string, params?: any[]) => {
589+
const result = await client.unsafe(sql, params ?? []);
590+
return result;
591+
};
592+
593+
const proxy: Proxy = async (params) => {
594+
const query = client.unsafe(params.sql, params.params);
595+
if (params.mode === 'array') {
596+
return await query.values();
597+
}
598+
return await query;
599+
};
600+
601+
const transactionProxy: TransactionProxy = async (queries) => {
602+
const results: any[] = [];
603+
try {
604+
await client.transaction(async (tx) => {
605+
for (const query of queries) {
606+
const result = await tx.unsafe(query.sql);
607+
results.push(result);
608+
}
609+
});
610+
} catch (error) {
611+
results.push(error as Error);
612+
}
613+
return results;
614+
};
615+
616+
return { packageName: 'bun', query, proxy, transactionProxy, migrate: migrateFn };
617+
}
618+
562619
console.error(
563-
"To connect to Postgres database - please install either of 'pg', 'postgres', '@neondatabase/serverless' or '@vercel/postgres' drivers",
620+
"To connect to Postgres database - please install either of 'pg', 'postgres', 'bun', '@neondatabase/serverless' or '@vercel/postgres' drivers",
564621
);
565622
process.exit(1);
566623
};
@@ -859,7 +916,7 @@ export const connectToMySQL = async (
859916
it: MysqlCredentials,
860917
): Promise<{
861918
db: DB;
862-
packageName: 'mysql2' | '@planetscale/database';
919+
packageName: 'mysql2' | '@planetscale/database' | 'bun';
863920
proxy: Proxy;
864921
transactionProxy: TransactionProxy;
865922
database: string;
@@ -868,6 +925,7 @@ export const connectToMySQL = async (
868925
const result = parseMysqlCredentials(it);
869926

870927
if (await checkPackage('mysql2')) {
928+
console.log(withStyle.info(`Using 'mysql2' driver for database querying`));
871929
const { createConnection } = await import('mysql2/promise');
872930
const { drizzle } = await import('drizzle-orm/mysql2');
873931
const { migrate } = await import('drizzle-orm/mysql2/migrator');
@@ -945,6 +1003,7 @@ export const connectToMySQL = async (
9451003
}
9461004

9471005
if (await checkPackage('@planetscale/database')) {
1006+
console.log(withStyle.info(`Using '@planetscale/database' driver for database querying`));
9481007
const { Client } = await import('@planetscale/database');
9491008
const { drizzle } = await import('drizzle-orm/planetscale-serverless');
9501009
const { migrate } = await import(
@@ -1000,8 +1059,73 @@ export const connectToMySQL = async (
10001059
};
10011060
}
10021061

1062+
if (await checkPackage('bun')) {
1063+
console.log(withStyle.info(`Using 'bun' driver for database querying`));
1064+
const { SQL } = await import('bun');
1065+
const { drizzle } = await import('drizzle-orm/bun-sql');
1066+
const { migrate } = await import('drizzle-orm/bun-sql/migrator');
1067+
1068+
const ssl = result.credentials && 'ssl' in result.credentials
1069+
? result.credentials.ssl === 'prefer'
1070+
|| result.credentials.ssl === 'require'
1071+
|| result.credentials.ssl === 'allow'
1072+
? true
1073+
: false
1074+
: undefined;
1075+
1076+
const client = result.url
1077+
? new SQL(result.url)
1078+
: new SQL({
1079+
adapter: 'mysql',
1080+
...result.credentials,
1081+
ssl,
1082+
});
1083+
1084+
const db = drizzle({ client });
1085+
const migrateFn = async (config: MigrationConfig) => {
1086+
return migrate(db, config);
1087+
};
1088+
1089+
const query = async (sql: string, params?: any[]) => {
1090+
const result = await client.unsafe(sql, params ?? []);
1091+
return result;
1092+
};
1093+
1094+
const proxy: Proxy = async (params) => {
1095+
const query = client.unsafe(params.sql, params.params);
1096+
if (params.mode === 'array') {
1097+
return await query.values();
1098+
}
1099+
return await query;
1100+
};
1101+
1102+
const transactionProxy: TransactionProxy = async (queries) => {
1103+
const results: any[] = [];
1104+
try {
1105+
await client.transaction(async (tx) => {
1106+
for (const query of queries) {
1107+
const result = await tx.unsafe(query.sql);
1108+
results.push(result);
1109+
}
1110+
});
1111+
} catch (error) {
1112+
results.push(error as Error);
1113+
}
1114+
return results;
1115+
};
1116+
1117+
return {
1118+
packageName: 'bun',
1119+
db: { query },
1120+
proxy,
1121+
transactionProxy,
1122+
migrate: migrateFn,
1123+
database: result.database,
1124+
};
1125+
}
1126+
10031127
console.error(
1004-
"To connect to MySQL database - please install either of 'mysql2' or '@planetscale/database' drivers",
1128+
"To connect to MySQL database - please install either of 'mysql2', 'bun' or '@planetscale/database' drivers",
10051129
);
10061130
process.exit(1);
10071131
};
@@ -1129,7 +1253,13 @@ export const connectToSQLite = async (
11291253
): Promise<
11301254
& SQLiteDB
11311255
& {
1132-
packageName: 'd1-http' | '@libsql/client' | 'better-sqlite3' | '@sqlitecloud/drivers' | '@tursodatabase/database';
1256+
packageName:
1257+
| 'd1-http'
1258+
| '@libsql/client'
1259+
| 'better-sqlite3'
1260+
| '@sqlitecloud/drivers'
1261+
| '@tursodatabase/database'
1262+
| 'bun';
11331263
migrate: (config: string | MigrationConfig) => Promise<void | MigratorInitFailResponse>;
11341264
proxy: Proxy;
11351265
transactionProxy: TransactionProxy;
@@ -1246,15 +1376,14 @@ export const connectToSQLite = async (
12461376
);
12471377
};
12481378

1249-
const db: SQLiteDB = {
1250-
query: async <T>(sql: string, params?: any[]) => {
1251-
const res = await remoteCallback(sql, params || [], 'all');
1252-
return res.rows as T[];
1253-
},
1254-
run: async (query: string) => {
1255-
await remoteCallback(query, [], 'run');
1256-
},
1379+
const query = async <T>(sql: string, params?: any[]) => {
1380+
const res = await remoteCallback(sql, params || [], 'all');
1381+
return res.rows as T[];
1382+
};
1383+
const run = async (query: string) => {
1384+
await remoteCallback(query, [], 'run');
12571385
};
1386+
12581387
const proxy: Proxy = async (params) => {
12591388
const preparedParams = prepareSqliteParams(params.params || [], 'd1-http');
12601389
const result = await remoteCallback(
@@ -1269,7 +1398,7 @@ export const connectToSQLite = async (
12691398
const result = await remoteBatchCallback(queries);
12701399
return result.rows;
12711400
};
1272-
return { ...db, packageName: 'd1-http', proxy, transactionProxy, migrate: migrateFn };
1401+
return { query, run, packageName: 'd1-http', proxy, transactionProxy, migrate: migrateFn };
12731402
} else if (driver === 'sqlite-cloud') {
12741403
assertPackages('@sqlitecloud/drivers');
12751404
const { Database } = await import('@sqlitecloud/drivers');
@@ -1360,6 +1489,7 @@ export const connectToSQLite = async (
13601489
}
13611490

13621491
if (await checkPackage('@libsql/client')) {
1492+
console.log(withStyle.info(`Using '@libsql/client' driver for database querying`));
13631493
const { createClient } = await import('@libsql/client');
13641494
const { drizzle } = await import('drizzle-orm/libsql');
13651495
const { migrate } = await import('drizzle-orm/libsql/migrator');
@@ -1372,18 +1502,12 @@ export const connectToSQLite = async (
13721502
return migrate(drzl, config);
13731503
};
13741504

1375-
const db: SQLiteDB = {
1376-
query: async <T>(sql: string, params?: any[]) => {
1377-
const res = await client.execute({ sql, args: params || [] }).catch((e) => {
1378-
throw new QueryError(e, sql, params || []);
1379-
});
1380-
return res.rows as T[];
1381-
},
1382-
run: async (query: string) => {
1383-
await client.execute(query).catch((e) => {
1384-
throw new QueryError(e, query, []);
1385-
});
1386-
},
1505+
const query = async <T>(sql: string, params?: any[]) => {
1506+
const res = await client.execute({ sql, args: params || [] });
1507+
return res.rows as T[];
1508+
};
1509+
const run = async (query: string) => {
1510+
await client.execute(query);
13871511
};
13881512

13891513
type Transaction = Awaited<ReturnType<typeof client.transaction>>;
@@ -1423,7 +1547,7 @@ export const connectToSQLite = async (
14231547
return results;
14241548
};
14251549

1426-
return { ...db, packageName: '@libsql/client', proxy, transactionProxy, migrate: migrateFn };
1550+
return { query, run, packageName: '@libsql/client', proxy, transactionProxy, migrate: migrateFn };
14271551
}
14281552

14291553
if (await checkPackage('@tursodatabase/database')) {
@@ -1482,6 +1606,7 @@ export const connectToSQLite = async (
14821606
}
14831607

14841608
if (await checkPackage('better-sqlite3')) {
1609+
console.log(withStyle.info(`Using 'better-sqlite3' driver for database querying`));
14851610
const { default: Database } = await import('better-sqlite3');
14861611
const { drizzle } = await import('drizzle-orm/better-sqlite3');
14871612
const { migrate } = await import('drizzle-orm/better-sqlite3/migrator');
@@ -1550,8 +1675,65 @@ export const connectToSQLite = async (
15501675
return { ...db, packageName: 'better-sqlite3', proxy, transactionProxy, migrate: migrateFn };
15511676
}
15521677

1678+
if (await checkPackage('bun')) {
1679+
console.log(withStyle.info(`Using 'bun' driver for database querying`));
1680+
const { SQL } = await import('bun');
1681+
const { drizzle } = await import('drizzle-orm/bun-sql');
1682+
const { migrate } = await import('drizzle-orm/bun-sql/migrator');
1683+
1684+
const client = new SQL({
1685+
adapter: 'sqlite',
1686+
filename: normaliseSQLiteUrl(credentials.url, 'bun'),
1687+
});
1688+
1689+
const db = drizzle({ client });
1690+
const migrateFn = async (config: MigrationConfig) => {
1691+
return migrate(db, config);
1692+
};
1693+
1694+
const query = async (sql: string, params?: any[]) => {
1695+
const result = await client.unsafe(sql, params ?? []);
1696+
return result;
1697+
};
1698+
const run = async (sql: string) => {
1699+
await client.unsafe(sql);
1700+
};
1701+
1702+
const proxy: Proxy = async (params) => {
1703+
const query = client.unsafe(params.sql, params.params);
1704+
if (params.mode === 'array') {
1705+
return await query.values();
1706+
}
1707+
return await query;
1708+
};
1709+
1710+
const transactionProxy: TransactionProxy = async (queries) => {
1711+
const results: any[] = [];
1712+
try {
1713+
await client.transaction(async (tx) => {
1714+
for (const query of queries) {
1715+
const result = await tx.unsafe(query.sql);
1716+
results.push(result);
1717+
}
1718+
});
1719+
} catch (error) {
1720+
results.push(error as Error);
1721+
}
1722+
return results;
1723+
};
1724+
1725+
return {
1726+
packageName: 'bun',
1727+
query,
1728+
run,
1729+
proxy,
1730+
transactionProxy,
1731+
migrate: migrateFn,
1732+
};
1733+
}
1734+
15531735
console.log(
1554-
"Please install either 'better-sqlite3' or '@libsql/client' for Drizzle Kit to connect to SQLite databases",
1736+
"Please install either 'better-sqlite3', '@libsql/client' or 'bun' for Drizzle Kit to connect to SQLite databases",
15551737
);
15561738
process.exit(1);
15571739
};

drizzle-kit/src/utils/utils-node.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,7 @@ export const validateWithReport = (snapshots: string[], dialect: Dialect) => {
300300

301301
export const normaliseSQLiteUrl = (
302302
it: string,
303-
type: 'libsql' | 'better-sqlite' | '@tursodatabase/database',
303+
type: 'libsql' | 'better-sqlite' | '@tursodatabase/database' | 'bun',
304304
) => {
305305
if (type === 'libsql') {
306306
if (it.startsWith('file:')) {
@@ -317,7 +317,7 @@ export const normaliseSQLiteUrl = (
317317
}
318318
}
319319

320-
if (type === 'better-sqlite' || type === '@tursodatabase/database') {
320+
if (type === 'better-sqlite' || type === '@tursodatabase/database' || type === 'bun') {
321321
if (it.startsWith('file:')) {
322322
return it.substring(5);
323323
}

drizzle-orm/src/cockroach-core/dialect.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,23 @@ export class CockroachDialect {
252252
} else {
253253
chunk.push(field.isAlias ? sql`${getOriginalColumnFromAlias(field)} as ${field}` : field);
254254
}
255+
} else if (is(field, Subquery)) {
256+
const entries = Object.entries(field._.selectedFields) as [string, SQL.Aliased | Column | SQL][];
257+
258+
if (entries.length === 1) {
259+
const entry = entries[0]![1];
260+
261+
const fieldDecoder = is(entry, SQL)
262+
? entry.decoder
263+
: is(entry, Column)
264+
? { mapFromDriverValue: (v: any) => entry.mapFromDriverValue(v) }
265+
: entry.sql.decoder;
266+
267+
if (fieldDecoder) {
268+
field._.sql.decoder = fieldDecoder;
269+
}
270+
}
271+
chunk.push(field);
255272
}
256273

257274
if (i < columnsLen - 1) {

0 commit comments

Comments
 (0)