Home / Class/ PgDialect Class — drizzle-orm Architecture

PgDialect Class — drizzle-orm Architecture

Architecture documentation for the PgDialect class in dialect.ts from the drizzle-orm codebase.

Entity Profile

Dependency Diagram

graph TD
  3977a3fd_2f08_73b1_4df4_3d0fd1858514["PgDialect"]
  f5d8a5f9_df11_57a8_8f3f_88924e501a7c["dialect.ts"]
  3977a3fd_2f08_73b1_4df4_3d0fd1858514 -->|defined in| f5d8a5f9_df11_57a8_8f3f_88924e501a7c
  134ad57a_5fcd_0d8c_b965_527bd05362ee["constructor()"]
  3977a3fd_2f08_73b1_4df4_3d0fd1858514 -->|method| 134ad57a_5fcd_0d8c_b965_527bd05362ee
  278c5ac7_639f_2cd1_f288_b7a7db4b7800["migrate()"]
  3977a3fd_2f08_73b1_4df4_3d0fd1858514 -->|method| 278c5ac7_639f_2cd1_f288_b7a7db4b7800
  e95d4798_c1ad_f78e_2708_062b604f3e7f["escapeName()"]
  3977a3fd_2f08_73b1_4df4_3d0fd1858514 -->|method| e95d4798_c1ad_f78e_2708_062b604f3e7f
  dd48691e_b93c_d196_c6f6_1f87fc689b39["escapeParam()"]
  3977a3fd_2f08_73b1_4df4_3d0fd1858514 -->|method| dd48691e_b93c_d196_c6f6_1f87fc689b39
  8a40e442_43d3_fc12_4113_2fdeb88e92b3["escapeString()"]
  3977a3fd_2f08_73b1_4df4_3d0fd1858514 -->|method| 8a40e442_43d3_fc12_4113_2fdeb88e92b3
  bcbd4f74_c6c7_2989_e283_a503bf2039fa["buildWithCTE()"]
  3977a3fd_2f08_73b1_4df4_3d0fd1858514 -->|method| bcbd4f74_c6c7_2989_e283_a503bf2039fa
  a2e40eaa_bf7f_0455_dd07_c8fd2cf636b4["buildDeleteQuery()"]
  3977a3fd_2f08_73b1_4df4_3d0fd1858514 -->|method| a2e40eaa_bf7f_0455_dd07_c8fd2cf636b4
  a779c29a_e3fb_1425_428d_6ff1a9724427["buildUpdateSet()"]
  3977a3fd_2f08_73b1_4df4_3d0fd1858514 -->|method| a779c29a_e3fb_1425_428d_6ff1a9724427
  51652aaf_93cd_307b_be64_ec6b5cfd33e6["buildUpdateQuery()"]
  3977a3fd_2f08_73b1_4df4_3d0fd1858514 -->|method| 51652aaf_93cd_307b_be64_ec6b5cfd33e6
  e700cd38_c0c8_fbeb_26a9_7fbf17216117["buildSelection()"]
  3977a3fd_2f08_73b1_4df4_3d0fd1858514 -->|method| e700cd38_c0c8_fbeb_26a9_7fbf17216117
  b947243c_21ad_f757_2719_e0aeb7980c05["buildJoins()"]
  3977a3fd_2f08_73b1_4df4_3d0fd1858514 -->|method| b947243c_21ad_f757_2719_e0aeb7980c05
  a3d42ee8_7394_7230_8590_b17469f33bad["buildFromTable()"]
  3977a3fd_2f08_73b1_4df4_3d0fd1858514 -->|method| a3d42ee8_7394_7230_8590_b17469f33bad
  9a7f35b1_0b1e_f3ac_68cb_233ef6bc00a0["buildSelectQuery()"]
  3977a3fd_2f08_73b1_4df4_3d0fd1858514 -->|method| 9a7f35b1_0b1e_f3ac_68cb_233ef6bc00a0

Relationship Graph

Source Code

drizzle-orm/src/pg-core/dialect.ts lines 63–1445

export class PgDialect {
	static readonly [entityKind]: string = 'PgDialect';

	/** @internal */
	readonly casing: CasingCache;

	constructor(config?: PgDialectConfig) {
		this.casing = new CasingCache(config?.casing);
	}

	async migrate(migrations: MigrationMeta[], session: PgSession, config: string | MigrationConfig): Promise<void> {
		const migrationsTable = typeof config === 'string'
			? '__drizzle_migrations'
			: config.migrationsTable ?? '__drizzle_migrations';
		const migrationsSchema = typeof config === 'string' ? 'drizzle' : config.migrationsSchema ?? 'drizzle';
		const migrationTableCreate = sql`
			CREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsSchema)}.${sql.identifier(migrationsTable)} (
				id SERIAL PRIMARY KEY,
				hash text NOT NULL,
				created_at bigint
			)
		`;
		await session.execute(sql`CREATE SCHEMA IF NOT EXISTS ${sql.identifier(migrationsSchema)}`);
		await session.execute(migrationTableCreate);

		const dbMigrations = await session.all<{ id: number; hash: string; created_at: string }>(
			sql`select id, hash, created_at from ${sql.identifier(migrationsSchema)}.${
				sql.identifier(migrationsTable)
			} order by created_at desc limit 1`,
		);

		const lastDbMigration = dbMigrations[0];
		await session.transaction(async (tx) => {
			for await (const migration of migrations) {
				if (
					!lastDbMigration
					|| Number(lastDbMigration.created_at) < migration.folderMillis
				) {
					for (const stmt of migration.sql) {
						await tx.execute(sql.raw(stmt));
					}
					await tx.execute(
						sql`insert into ${sql.identifier(migrationsSchema)}.${
							sql.identifier(migrationsTable)
						} ("hash", "created_at") values(${migration.hash}, ${migration.folderMillis})`,
					);
				}
			}
		});
	}

	escapeName(name: string): string {
		return `"${name}"`;
	}

	escapeParam(num: number): string {
		return `$${num + 1}`;
	}

	escapeString(str: string): string {
		return `'${str.replace(/'/g, "''")}'`;
	}

	private buildWithCTE(queries: Subquery[] | undefined): SQL | undefined {
		if (!queries?.length) return undefined;

		const withSqlChunks = [sql`with `];
		for (const [i, w] of queries.entries()) {
			withSqlChunks.push(sql`${sql.identifier(w._.alias)} as (${w._.sql})`);
			if (i < queries.length - 1) {
				withSqlChunks.push(sql`, `);
			}
		}
		withSqlChunks.push(sql` `);
		return sql.join(withSqlChunks);
	}

	buildDeleteQuery({ table, where, returning, withList }: PgDeleteConfig): SQL {
		const withSql = this.buildWithCTE(withList);

		const returningSql = returning

Domain

Frequently Asked Questions

What is the PgDialect class?
PgDialect is a class in the drizzle-orm codebase, defined in drizzle-orm/src/pg-core/dialect.ts.
Where is PgDialect defined?
PgDialect is defined in drizzle-orm/src/pg-core/dialect.ts at line 63.

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free