Skip to content

Commit 8c9691b

Browse files
authored
Merge pull request #180 from drizzle-team/orm-143-default-logger
Add logger shorthand and logger docs
2 parents e8d0715 + 927b693 commit 8c9691b

File tree

17 files changed

+229
-38
lines changed

17 files changed

+229
-38
lines changed

changelogs/drizzle-orm/0.20.1.md

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
- 🎉 Added `{ logger: true }` shorthand to `drizzle()` to enable query logging. See [logging docs](/drizzle-orm/src/pg-core/README.md#logging) for detailed logging configuration.

drizzle-orm/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "drizzle-orm",
3-
"version": "0.20.0",
3+
"version": "0.20.1",
44
"description": "Drizzle ORM package for SQL databases",
55
"scripts": {
66
"build": "tsc && resolve-tspaths && cp ../README.md package.json dist/",

drizzle-orm/src/aws-data-api/pg/driver.ts

+9-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Logger } from '~/logger';
1+
import { DefaultLogger, Logger } from '~/logger';
22
import { PgDatabase } from '~/pg-core/db';
33
import { PgDialect } from '~/pg-core/dialect';
44
import { AwsDataApiClient, AwsDataApiPgQueryResultHKT, AwsDataApiSession } from './session';
@@ -24,7 +24,7 @@ export class AwsDataApiDriver {
2424
}
2525

2626
export interface DrizzleConfig {
27-
logger?: Logger;
27+
logger?: boolean | Logger;
2828
database: string;
2929
resourceArn: string;
3030
secretArn: string;
@@ -44,7 +44,13 @@ export class AwsPgDialect extends PgDialect {
4444

4545
export function drizzle(client: AwsDataApiClient, config: DrizzleConfig): AwsDataApiPgDatabase {
4646
const dialect = new AwsPgDialect();
47-
const driver = new AwsDataApiDriver(client, dialect, config);
47+
let logger;
48+
if (config.logger === true) {
49+
logger = new DefaultLogger();
50+
} else if (config.logger !== false) {
51+
logger = config.logger;
52+
}
53+
const driver = new AwsDataApiDriver(client, dialect, { ...config, logger });
4854
const session = driver.createSession();
4955
return new PgDatabase(dialect, session);
5056
}
+9-3
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,23 @@
11
import { Database, RunResult } from 'better-sqlite3';
2-
import { Logger } from '~/logger';
2+
import { DefaultLogger, Logger } from '~/logger';
33
import { BaseSQLiteDatabase } from '~/sqlite-core/db';
44
import { SQLiteSyncDialect } from '~/sqlite-core/dialect';
55
import { BetterSQLiteSession } from './session';
66

77
export interface DrizzleConfig {
8-
logger?: Logger;
8+
logger?: boolean | Logger;
99
}
1010

1111
export type BetterSQLite3Database = BaseSQLiteDatabase<'sync', RunResult>;
1212

1313
export function drizzle(client: Database, config: DrizzleConfig = {}): BetterSQLite3Database {
1414
const dialect = new SQLiteSyncDialect();
15-
const session = new BetterSQLiteSession(client, dialect, { logger: config.logger });
15+
let logger;
16+
if (config.logger === true) {
17+
logger = new DefaultLogger();
18+
} else if (config.logger !== false) {
19+
logger = config.logger;
20+
}
21+
const session = new BetterSQLiteSession(client, dialect, { logger });
1622
return new BaseSQLiteDatabase(dialect, session);
1723
}

drizzle-orm/src/bun-sqlite/driver.ts

+9-3
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,25 @@
11
/// <reference types="bun-types" />
22

33
import { Database } from 'bun:sqlite';
4-
import { Logger } from '~/logger';
4+
import { DefaultLogger, Logger } from '~/logger';
55
import { BaseSQLiteDatabase } from '~/sqlite-core/db';
66
import { SQLiteSyncDialect } from '~/sqlite-core/dialect';
77
import { SQLiteBunSession } from './session';
88

99
export interface DrizzleConfig {
10-
logger?: Logger;
10+
logger?: boolean | Logger;
1111
}
1212

1313
export type BunSQLiteDatabase = BaseSQLiteDatabase<'sync', void>;
1414

1515
export function drizzle(client: Database, config: DrizzleConfig = {}): BunSQLiteDatabase {
1616
const dialect = new SQLiteSyncDialect();
17-
const session = new SQLiteBunSession(client, dialect, { logger: config.logger });
17+
let logger;
18+
if (config.logger === true) {
19+
logger = new DefaultLogger();
20+
} else if (config.logger !== false) {
21+
logger = config.logger;
22+
}
23+
const session = new SQLiteBunSession(client, dialect, { logger });
1824
return new BaseSQLiteDatabase(dialect, session);
1925
}

drizzle-orm/src/d1/driver.ts

+9-3
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,24 @@
11
/// <reference types="@cloudflare/workers-types" />
22

3-
import { Logger } from '~/logger';
3+
import { DefaultLogger, Logger } from '~/logger';
44
import { BaseSQLiteDatabase } from '~/sqlite-core/db';
55
import { SQLiteAsyncDialect } from '~/sqlite-core/dialect';
66
import { SQLiteD1Session } from './session';
77

88
export interface DrizzleConfig {
9-
logger?: Logger;
9+
logger?: boolean | Logger;
1010
}
1111

1212
export type DrizzleD1Database = BaseSQLiteDatabase<'async', D1Result>;
1313

1414
export function drizzle(client: D1Database, config: DrizzleConfig = {}): DrizzleD1Database {
1515
const dialect = new SQLiteAsyncDialect();
16-
const session = new SQLiteD1Session(client, dialect, { logger: config.logger });
16+
let logger;
17+
if (config.logger === true) {
18+
logger = new DefaultLogger();
19+
} else if (config.logger !== false) {
20+
logger = config.logger;
21+
}
22+
const session = new SQLiteD1Session(client, dialect, { logger });
1723
return new BaseSQLiteDatabase(dialect, session);
1824
}

drizzle-orm/src/mysql-core/README.md

+42
Original file line numberDiff line numberDiff line change
@@ -725,3 +725,45 @@ const db = drizzle(poolConnection);
725725
// this will automatically run needed migrations on the database
726726
await migrate(db, { migrationsFolder: './drizzle' });
727727
```
728+
729+
## Logging
730+
731+
To enable default query logging, just pass `{ logger: true }` to the `drizzle` function:
732+
733+
```typescript
734+
import { drizzle } from 'drizzle-orm/mysql2';
735+
736+
const db = drizzle(pool, { logger: true });
737+
```
738+
739+
You can change the logs destination by creating a `DefaultLogger` instance and providing a custom `writer` to it:
740+
741+
```typescript
742+
import { DefaultLogger, LogWriter } from 'drizzle-orm/logger';
743+
import { drizzle } from 'drizzle-orm/mysql2';
744+
745+
class MyLogWriter implements LogWriter {
746+
write(message: string) {
747+
// Write to file, console, etc.
748+
}
749+
}
750+
751+
const logger = new DefaultLogger({ writer: new MyLogWriter() });
752+
753+
const db = drizzle(pool, { logger });
754+
```
755+
756+
You can also create a custom logger:
757+
758+
```typescript
759+
import { Logger } from 'drizzle-orm/logger';
760+
import { drizzle } from 'drizzle-orm/mysql2';
761+
762+
class MyLogger implements Logger {
763+
logQuery(query: string, params: unknown[]): void {
764+
console.log({ query, params });
765+
}
766+
}
767+
768+
const db = drizzle(pool, { logger: new MyLogger() });
769+
```

drizzle-orm/src/mysql2/driver.ts

+10-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Logger } from '~/logger';
1+
import { DefaultLogger, Logger } from '~/logger';
22
import { MySqlDialect } from '~/mysql-core/dialect';
33
import { MySqlDatabase } from '.';
44
import { MySql2Client, MySql2QueryResultHKT, MySql2Session } from './session';
@@ -21,7 +21,7 @@ export class MySql2Driver {
2121
}
2222

2323
export interface DrizzleConfig {
24-
logger?: Logger;
24+
logger?: boolean | Logger;
2525
}
2626

2727
export { MySqlDatabase } from '~/mysql-core/db';
@@ -33,7 +33,13 @@ export function drizzle(
3333
config: DrizzleConfig = {},
3434
): MySql2Database {
3535
const dialect = new MySqlDialect();
36-
const driver = new MySql2Driver(client, dialect, { logger: config.logger });
36+
let logger;
37+
if (config.logger === true) {
38+
logger = new DefaultLogger();
39+
} else if (config.logger !== false) {
40+
logger = config.logger;
41+
}
42+
const driver = new MySql2Driver(client, dialect, { logger });
3743
const session = driver.createSession();
38-
return new MySqlDatabase(dialect, session)
44+
return new MySqlDatabase(dialect, session);
3945
}

drizzle-orm/src/neon-serverless/driver.ts

+9-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { types } from '@neondatabase/serverless';
2-
import { Logger } from '~/logger';
2+
import { DefaultLogger, Logger } from '~/logger';
33
import { PgDatabase } from '~/pg-core/db';
44
import { PgDialect } from '~/pg-core/dialect';
55
import { NeonClient, NeonQueryResultHKT, NeonSession } from './session';
@@ -29,14 +29,20 @@ export class NeonDriver {
2929
}
3030

3131
export interface DrizzleConfig {
32-
logger?: Logger;
32+
logger?: boolean | Logger;
3333
}
3434

3535
export type NeonDatabase = PgDatabase<NeonQueryResultHKT, NeonSession>;
3636

3737
export function drizzle(client: NeonClient, config: DrizzleConfig = {}): NeonDatabase {
3838
const dialect = new PgDialect();
39-
const driver = new NeonDriver(client, dialect, { logger: config.logger });
39+
let logger;
40+
if (config.logger === true) {
41+
logger = new DefaultLogger();
42+
} else if (config.logger !== false) {
43+
logger = config.logger;
44+
}
45+
const driver = new NeonDriver(client, dialect, { logger });
4046
const session = driver.createSession();
4147
return new PgDatabase(dialect, session);
4248
}

drizzle-orm/src/node-postgres/driver.ts

+9-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { types } from 'pg';
2-
import { Logger } from '~/logger';
2+
import { DefaultLogger, Logger } from '~/logger';
33
import { PgDatabase } from '~/pg-core/db';
44
import { PgDialect } from '~/pg-core/dialect';
55
import { NodePgClient, NodePgQueryResultHKT, NodePgSession } from './session';
@@ -29,14 +29,20 @@ export class NodePgDriver {
2929
}
3030

3131
export interface DrizzleConfig {
32-
logger?: Logger;
32+
logger?: boolean | Logger;
3333
}
3434

3535
export type NodePgDatabase = PgDatabase<NodePgQueryResultHKT, NodePgSession>;
3636

3737
export function drizzle(client: NodePgClient, config: DrizzleConfig = {}): NodePgDatabase {
3838
const dialect = new PgDialect();
39-
const driver = new NodePgDriver(client, dialect, { logger: config.logger });
39+
let logger;
40+
if (config.logger === true) {
41+
logger = new DefaultLogger();
42+
} else if (config.logger !== false) {
43+
logger = config.logger;
44+
}
45+
const driver = new NodePgDriver(client, dialect, { logger });
4046
const session = driver.createSession();
4147
return new PgDatabase(dialect, session);
4248
}

drizzle-orm/src/pg-core/README.md

+42
Original file line numberDiff line numberDiff line change
@@ -775,3 +775,45 @@ const db = drizzle(pool);
775775
// this will automatically run needed migrations on the database
776776
await migrate(db, { migrationsFolder: './drizzle' });
777777
```
778+
779+
## Logging
780+
781+
To enable default query logging, just pass `{ logger: true }` to the `drizzle` function:
782+
783+
```typescript
784+
import { drizzle } from 'drizzle-orm/node-postgres';
785+
786+
const db = drizzle(pool, { logger: true });
787+
```
788+
789+
You can change the logs destination by creating a `DefaultLogger` instance and providing a custom `writer` to it:
790+
791+
```typescript
792+
import { DefaultLogger, LogWriter } from 'drizzle-orm/logger';
793+
import { drizzle } from 'drizzle-orm/node-postgres';
794+
795+
class MyLogWriter implements LogWriter {
796+
write(message: string) {
797+
// Write to file, console, etc.
798+
}
799+
}
800+
801+
const logger = new DefaultLogger({ writer: new MyLogWriter() });
802+
803+
const db = drizzle(pool, { logger });
804+
```
805+
806+
You can also create a custom logger:
807+
808+
```typescript
809+
import { Logger } from 'drizzle-orm/logger';
810+
import { drizzle } from 'drizzle-orm/node-postgres';
811+
812+
class MyLogger implements Logger {
813+
logQuery(query: string, params: unknown[]): void {
814+
console.log({ query, params });
815+
}
816+
}
817+
818+
const db = drizzle(pool, { logger: new MyLogger() });
819+
```

drizzle-orm/src/planetscale-serverless/driver.ts

+9-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Connection } from '@planetscale/database';
2-
import { Logger } from '~/logger';
2+
import { DefaultLogger, Logger } from '~/logger';
33
import { MySqlDatabase } from '~/mysql-core/db';
44
import { MySqlDialect } from '~/mysql-core/dialect';
55
import { PlanetscaleQueryResultHKT, PlanetscaleSession } from './session';
@@ -22,7 +22,7 @@ export class PlanetscaleDriver {
2222
}
2323

2424
export interface DrizzleConfig {
25-
logger?: Logger;
25+
logger?: boolean | Logger;
2626
}
2727

2828
export type PlanetScaleDatabase = MySqlDatabase<PlanetscaleQueryResultHKT, PlanetscaleSession>;
@@ -32,7 +32,13 @@ export function drizzle(
3232
config: DrizzleConfig = {},
3333
): PlanetScaleDatabase {
3434
const dialect = new MySqlDialect();
35-
const driver = new PlanetscaleDriver(client, dialect, { logger: config.logger });
35+
let logger;
36+
if (config.logger === true) {
37+
logger = new DefaultLogger();
38+
} else if (config.logger !== false) {
39+
logger = config.logger;
40+
}
41+
const driver = new PlanetscaleDriver(client, dialect, { logger });
3642
const session = driver.createSession();
3743
return new MySqlDatabase(dialect, session);
3844
}

drizzle-orm/src/postgres-js/driver.ts

+9-3
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,23 @@
11
import { Sql } from 'postgres';
2-
import { Logger } from '~/logger';
2+
import { DefaultLogger, Logger } from '~/logger';
33
import { PgDatabase } from '~/pg-core/db';
44
import { PgDialect } from '~/pg-core/dialect';
55
import { PostgresJsQueryResultHKT, PostgresJsSession } from './session';
66

77
export interface DrizzleConfig {
8-
logger?: Logger;
8+
logger?: boolean | Logger;
99
}
1010

1111
export type PostgresJsDatabase = PgDatabase<PostgresJsQueryResultHKT, PostgresJsSession>;
1212

1313
export function drizzle(client: Sql, config: DrizzleConfig = {}): PostgresJsDatabase {
1414
const dialect = new PgDialect();
15-
const session = new PostgresJsSession(client, dialect, { logger: config.logger });
15+
let logger;
16+
if (config.logger === true) {
17+
logger = new DefaultLogger();
18+
} else if (config.logger !== false) {
19+
logger = config.logger;
20+
}
21+
const session = new PostgresJsSession(client, dialect, { logger });
1622
return new PgDatabase(dialect, session);
1723
}

drizzle-orm/src/sql-js/driver.ts

+9-3
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,23 @@
11
import { Database } from 'sql.js';
2-
import { Logger } from '~/logger';
2+
import { DefaultLogger, Logger } from '~/logger';
33
import { BaseSQLiteDatabase } from '~/sqlite-core/db';
44
import { SQLiteSyncDialect } from '~/sqlite-core/dialect';
55
import { SQLJsSession } from './session';
66

77
export interface DrizzleConfig {
8-
logger?: Logger;
8+
logger?: boolean | Logger;
99
}
1010

1111
export type SQLJsDatabase = BaseSQLiteDatabase<'sync', void>;
1212

1313
export function drizzle(client: Database, config: DrizzleConfig = {}): SQLJsDatabase {
1414
const dialect = new SQLiteSyncDialect();
15-
const session = new SQLJsSession(client, dialect, { logger: config.logger });
15+
let logger;
16+
if (config.logger === true) {
17+
logger = new DefaultLogger();
18+
} else if (config.logger !== false) {
19+
logger = config.logger;
20+
}
21+
const session = new SQLJsSession(client, dialect, { logger });
1622
return new BaseSQLiteDatabase(dialect, session);
1723
}

0 commit comments

Comments
 (0)