Skip to content

Commit c8359a1

Browse files
Merge pull request #2847 from drizzle-team/beta
Beta
2 parents 90c4788 + 30e7661 commit c8359a1

28 files changed

+222
-225
lines changed

.github/workflows/release-feature-branch.yaml

-6
Original file line numberDiff line numberDiff line change
@@ -136,12 +136,6 @@ jobs:
136136
cd drizzle-orm
137137
pnpm prisma generate --schema src/prisma/schema.prisma
138138
)
139-
(
140-
cd integration-tests
141-
pnpm prisma generate --schema tests/prisma/pg/schema.prisma
142-
pnpm prisma generate --schema tests/prisma/mysql/schema.prisma
143-
pnpm prisma generate --schema tests/prisma/sqlite/schema.prisma
144-
)
145139
pnpm build
146140
147141
- name: Run tests

.github/workflows/release-latest.yaml

-6
Original file line numberDiff line numberDiff line change
@@ -139,12 +139,6 @@ jobs:
139139
cd drizzle-orm
140140
pnpm prisma generate --schema src/prisma/schema.prisma
141141
)
142-
(
143-
cd integration-tests
144-
pnpm prisma generate --schema tests/prisma/pg/schema.prisma
145-
pnpm prisma generate --schema tests/prisma/mysql/schema.prisma
146-
pnpm prisma generate --schema tests/prisma/sqlite/schema.prisma
147-
)
148142
pnpm build
149143
150144
- name: Run tests

changelogs/drizzle-kit/0.24.2.md

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
## New Features
2+
3+
### 🎉 Support for `pglite` driver
4+
5+
You can now use pglite with all drizzle-kit commands, including Drizzle Studio!
6+
7+
```ts
8+
import { defineConfig } from "drizzle-kit";
9+
10+
export default defineConfig({
11+
dialect: "postgresql",
12+
driver: "pglite",
13+
schema: "./schema.ts",
14+
dbCredentials: {
15+
url: "local-pg.db",
16+
},
17+
verbose: true,
18+
strict: true,
19+
});
20+
```
21+
22+
## Bug fixes
23+
24+
- mysql-kit: fix GENERATED ALWAYS AS ... NOT NULL - [#2824](https://github.com/drizzle-team/drizzle-orm/pull/2824)

drizzle-kit/build.ts

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ const driversPackages = [
99
'postgres',
1010
'@vercel/postgres',
1111
'@neondatabase/serverless',
12+
'@electric-sql/pglite',
1213
// mysql drivers
1314
'mysql2',
1415
'@planetscale/database',

drizzle-kit/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "drizzle-kit",
3-
"version": "0.24.1",
3+
"version": "0.24.2",
44
"homepage": "https://orm.drizzle.team",
55
"keywords": [
66
"drizzle",

drizzle-kit/src/cli/commands/utils.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ export const safeRegister = async () => {
7979
export const prepareCheckParams = async (
8080
options: {
8181
config?: string;
82-
dialect: Dialect;
82+
dialect?: Dialect;
8383
out?: string;
8484
},
8585
from: 'cli' | 'config',

drizzle-kit/src/cli/connections.ts

+61-3
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import fetch from 'node-fetch';
55
import ws from 'ws';
66
import { assertUnreachable } from '../global';
77
import type { ProxyParams } from '../serializer/studio';
8-
import { type DB, normaliseSQLiteUrl, type Proxy, type SQLiteDB, type SqliteProxy } from '../utils';
8+
import { type DB, normalisePGliteUrl, normaliseSQLiteUrl, type Proxy, type SQLiteDB, type SqliteProxy } from '../utils';
99
import { assertPackages, checkPackage } from './utils';
1010
import type { MysqlCredentials } from './validations/mysql';
1111
import { withStyle } from './validations/outputs';
@@ -21,7 +21,8 @@ export const preparePostgresDB = async (
2121
}
2222
> => {
2323
if ('driver' in credentials) {
24-
if (credentials.driver === 'aws-data-api') {
24+
const { driver } = credentials;
25+
if (driver === 'aws-data-api') {
2526
assertPackages('@aws-sdk/client-rds-data');
2627
const { RDSDataClient, ExecuteStatementCommand, TypeHint } = await import(
2728
'@aws-sdk/client-rds-data'
@@ -92,7 +93,45 @@ export const preparePostgresDB = async (
9293
};
9394
}
9495

95-
assertUnreachable(credentials.driver);
96+
if (driver === 'pglite') {
97+
assertPackages('@electric-sql/pglite');
98+
const { PGlite } = await import('@electric-sql/pglite');
99+
const { drizzle } = await import('drizzle-orm/pglite');
100+
const { migrate } = await import('drizzle-orm/pglite/migrator');
101+
102+
const pglite = new PGlite(normalisePGliteUrl(credentials.url));
103+
await pglite.waitReady;
104+
const drzl = drizzle(pglite);
105+
const migrateFn = async (config: MigrationConfig) => {
106+
return migrate(drzl, config);
107+
};
108+
109+
const query = async <T>(sql: string, params: any[] = []) => {
110+
const result = await pglite.query(sql, params);
111+
return result.rows as T[];
112+
};
113+
114+
const proxy = async (params: ProxyParams) => {
115+
const preparedParams = preparePGliteParams(params.params);
116+
if (
117+
params.method === 'values'
118+
|| params.method === 'get'
119+
|| params.method === 'all'
120+
) {
121+
const result = await pglite.query(params.sql, preparedParams, {
122+
rowMode: params.mode,
123+
});
124+
return result.rows;
125+
}
126+
127+
const result = await pglite.query(params.sql, preparedParams);
128+
return result.rows;
129+
};
130+
131+
return { query, proxy, migrate: migrateFn };
132+
}
133+
134+
assertUnreachable(driver);
96135
}
97136

98137
if (await checkPackage('pg')) {
@@ -415,6 +454,25 @@ const prepareSqliteParams = (params: any[], driver?: string) => {
415454
});
416455
};
417456

457+
const preparePGliteParams = (params: any[]) => {
458+
return params.map((param) => {
459+
if (
460+
param
461+
&& typeof param === 'object'
462+
&& 'type' in param
463+
&& 'value' in param
464+
&& param.type === 'binary'
465+
) {
466+
const value = typeof param.value === 'object'
467+
? JSON.stringify(param.value)
468+
: (param.value as string);
469+
470+
return value;
471+
}
472+
return param;
473+
});
474+
};
475+
418476
export const connectToSQLite = async (
419477
credentials: SqliteCredentials,
420478
): Promise<

drizzle-kit/src/cli/schema.ts

+40-8
Original file line numberDiff line numberDiff line change
@@ -108,15 +108,23 @@ export const migrate = command({
108108
try {
109109
if (dialect === 'postgresql') {
110110
if ('driver' in credentials) {
111-
if (credentials.driver === 'aws-data-api') {
111+
const { driver } = credentials;
112+
if (driver === 'aws-data-api') {
112113
if (!(await ormVersionGt('0.30.10'))) {
113114
console.log(
114115
"To use 'aws-data-api' driver - please update drizzle-orm to the latest version",
115116
);
116117
process.exit(1);
117118
}
119+
} else if (driver === 'pglite') {
120+
if (!(await ormVersionGt('0.30.6'))) {
121+
console.log(
122+
"To use 'pglite' driver - please update drizzle-orm to the latest version",
123+
);
124+
process.exit(1);
125+
}
118126
} else {
119-
assertUnreachable(credentials.driver);
127+
assertUnreachable(driver);
120128
}
121129
}
122130
const { preparePostgresDB } = await import('./connections');
@@ -256,15 +264,23 @@ export const push = command({
256264
);
257265
} else if (dialect === 'postgresql') {
258266
if ('driver' in credentials) {
259-
if (credentials.driver === 'aws-data-api') {
267+
const { driver } = credentials;
268+
if (driver === 'aws-data-api') {
260269
if (!(await ormVersionGt('0.30.10'))) {
261270
console.log(
262271
"To use 'aws-data-api' driver - please update drizzle-orm to the latest version",
263272
);
264273
process.exit(1);
265274
}
275+
} else if (driver === 'pglite') {
276+
if (!(await ormVersionGt('0.30.6'))) {
277+
console.log(
278+
"To use 'pglite' driver - please update drizzle-orm to the latest version",
279+
);
280+
process.exit(1);
281+
}
266282
} else {
267-
assertUnreachable(credentials.driver);
283+
assertUnreachable(driver);
268284
}
269285
}
270286

@@ -417,15 +433,23 @@ export const pull = command({
417433
try {
418434
if (dialect === 'postgresql') {
419435
if ('driver' in credentials) {
420-
if (credentials.driver === 'aws-data-api') {
436+
const { driver } = credentials;
437+
if (driver === 'aws-data-api') {
421438
if (!(await ormVersionGt('0.30.10'))) {
422439
console.log(
423440
"To use 'aws-data-api' driver - please update drizzle-orm to the latest version",
424441
);
425442
process.exit(1);
426443
}
444+
} else if (driver === 'pglite') {
445+
if (!(await ormVersionGt('0.30.6'))) {
446+
console.log(
447+
"To use 'pglite' driver - please update drizzle-orm to the latest version",
448+
);
449+
process.exit(1);
450+
}
427451
} else {
428-
assertUnreachable(credentials.driver);
452+
assertUnreachable(driver);
429453
}
430454
}
431455

@@ -525,15 +549,23 @@ export const studio = command({
525549
try {
526550
if (dialect === 'postgresql') {
527551
if ('driver' in credentials) {
528-
if (credentials.driver === 'aws-data-api') {
552+
const { driver } = credentials;
553+
if (driver === 'aws-data-api') {
529554
if (!(await ormVersionGt('0.30.10'))) {
530555
console.log(
531556
"To use 'aws-data-api' driver - please update drizzle-orm to the latest version",
532557
);
533558
process.exit(1);
534559
}
560+
} else if (driver === 'pglite') {
561+
if (!(await ormVersionGt('0.30.6'))) {
562+
console.log(
563+
"To use 'pglite' driver - please update drizzle-orm to the latest version",
564+
);
565+
process.exit(1);
566+
}
535567
} else {
536-
assertUnreachable(credentials.driver);
568+
assertUnreachable(driver);
537569
}
538570
}
539571

drizzle-kit/src/cli/validations/common.ts

+7-2
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,11 @@ export const sqliteDriversLiterals = [
6666
literal('expo'),
6767
] as const;
6868

69+
export const postgresqlDriversLiterals = [
70+
literal('aws-data-api'),
71+
literal('pglite'),
72+
] as const;
73+
6974
export const prefixes = [
7075
'index',
7176
'timestamp',
@@ -81,7 +86,7 @@ export type Prefix = (typeof prefixes)[number];
8186
}
8287

8388
export const sqliteDriver = union(sqliteDriversLiterals);
84-
export const postgresDriver = literal('aws-data-api');
89+
export const postgresDriver = union(postgresqlDriversLiterals);
8590
export const driver = union([sqliteDriver, postgresDriver]);
8691

8792
export const configMigrations = object({
@@ -151,7 +156,7 @@ export const configPushSchema = object({
151156
});
152157

153158
export type CliConfig = TypeOf<typeof configCommonSchema>;
154-
export const drivers = ['turso', 'd1-http', 'expo', 'aws-data-api'] as const;
159+
export const drivers = ['turso', 'd1-http', 'expo', 'aws-data-api', 'pglite'] as const;
155160
export type Driver = (typeof drivers)[number];
156161
const _: Driver = '' as TypeOf<typeof driver>;
157162

drizzle-kit/src/cli/validations/postgres.ts

+4
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@ export const postgresCredentials = union([
3535
secretArn: string().min(1),
3636
resourceArn: string().min(1),
3737
}),
38+
object({
39+
driver: literal('pglite'),
40+
url: string().min(1),
41+
}),
3842
]);
3943

4044
export type PostgresCredentials = TypeOf<typeof postgresCredentials>;

drizzle-kit/src/index.ts

+10-3
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ type Verify<T, U extends T> = U;
4040
*
4141
* ---
4242
* `driver` - optional param that is responsible for explicitly providing a driver to use when accessing a database
43-
* *Possible values*: `aws-data-api`, `d1-http`, `expo`, `turso`
43+
* *Possible values*: `aws-data-api`, `d1-http`, `expo`, `turso`, `pglite`
4444
* If you don't use AWS Data API, D1, Turso or Expo - ypu don't need this driver. You can check a driver strategy choice here: https://orm.drizzle.team/kit-docs/upgrade-21
4545
*
4646
* See https://orm.drizzle.team/kit-docs/config-reference#driver
@@ -136,7 +136,7 @@ export type Config =
136136
};
137137
}
138138
| {
139-
dialect: 'sqlite';
139+
dialect: Verify<Dialect, 'sqlite'>;
140140
dbCredentials: {
141141
url: string;
142142
};
@@ -171,6 +171,13 @@ export type Config =
171171
resourceArn: string;
172172
};
173173
}
174+
| {
175+
dialect: Verify<Dialect, 'postgresql'>;
176+
driver: Verify<Driver, 'pglite'>;
177+
dbCredentials: {
178+
url: string;
179+
};
180+
}
174181
| {
175182
dialect: Verify<Dialect, 'mysql'>;
176183
dbCredentials:
@@ -226,7 +233,7 @@ export type Config =
226233
*
227234
* ---
228235
* `driver` - optional param that is responsible for explicitly providing a driver to use when accessing a database
229-
* *Possible values*: `aws-data-api`, `d1-http`, `expo`, `turso`
236+
* *Possible values*: `aws-data-api`, `d1-http`, `expo`, `turso`, `pglite`
230237
* If you don't use AWS Data API, D1, Turso or Expo - ypu don't need this driver. You can check a driver strategy choice here: https://orm.drizzle.team/kit-docs/upgrade-21
231238
*
232239
* See https://orm.drizzle.team/kit-docs/config-reference#driver

drizzle-kit/src/serializer/studio.ts

+6-4
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ type SchemaFile = {
4444
export type Setup = {
4545
dbHash: string;
4646
dialect: 'postgresql' | 'mysql' | 'sqlite';
47-
driver?: 'aws-data-api' | 'd1-http' | 'turso';
47+
driver?: 'aws-data-api' | 'd1-http' | 'turso' | 'pglite';
4848
proxy: (params: ProxyParams) => Promise<any[] | any>;
4949
customDefaults: CustomDefault[];
5050
schema: Record<string, Record<string, AnyTable<any>>>;
@@ -218,11 +218,13 @@ export const drizzleForPostgres = async (
218218
let dbUrl: string;
219219

220220
if ('driver' in credentials) {
221-
// aws-data-api
222-
if (credentials.driver === 'aws-data-api') {
221+
const { driver } = credentials;
222+
if (driver === 'aws-data-api') {
223223
dbUrl = `aws-data-api://${credentials.database}/${credentials.secretArn}/${credentials.resourceArn}`;
224+
} else if (driver === 'pglite') {
225+
dbUrl = credentials.url;
224226
} else {
225-
assertUnreachable(credentials.driver);
227+
assertUnreachable(driver);
226228
}
227229
} else if ('url' in credentials) {
228230
dbUrl = credentials.url;

0 commit comments

Comments
 (0)