Home / Class/ MySqlDialect Class — drizzle-orm Architecture

MySqlDialect Class — drizzle-orm Architecture

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

Entity Profile

Dependency Diagram

graph TD
  9c5eee4c_4b78_a585_4038_d710de212097["MySqlDialect"]
  8f4067ff_24d4_558a_f9a8_8c5b4d708ae5["dialect.ts"]
  9c5eee4c_4b78_a585_4038_d710de212097 -->|defined in| 8f4067ff_24d4_558a_f9a8_8c5b4d708ae5
  68cf8bf4_2ee3_8fcf_5f5e_5ce21942f7b5["constructor()"]
  9c5eee4c_4b78_a585_4038_d710de212097 -->|method| 68cf8bf4_2ee3_8fcf_5f5e_5ce21942f7b5
  fa772623_beb4_6a0e_616a_092d0565b6b1["migrate()"]
  9c5eee4c_4b78_a585_4038_d710de212097 -->|method| fa772623_beb4_6a0e_616a_092d0565b6b1
  84c9e128_822c_2603_7477_397edc64e84d["escapeName()"]
  9c5eee4c_4b78_a585_4038_d710de212097 -->|method| 84c9e128_822c_2603_7477_397edc64e84d
  5c36d413_68ec_3851_3a86_541be5ff068a["escapeParam()"]
  9c5eee4c_4b78_a585_4038_d710de212097 -->|method| 5c36d413_68ec_3851_3a86_541be5ff068a
  2b28f0b1_d7dc_61db_92c1_ff9bb6834021["escapeString()"]
  9c5eee4c_4b78_a585_4038_d710de212097 -->|method| 2b28f0b1_d7dc_61db_92c1_ff9bb6834021
  36b61a5b_7f68_2e43_5760_d461578993f6["buildWithCTE()"]
  9c5eee4c_4b78_a585_4038_d710de212097 -->|method| 36b61a5b_7f68_2e43_5760_d461578993f6
  6603fb43_ff6f_ad94_0e94_0f152d804075["buildDeleteQuery()"]
  9c5eee4c_4b78_a585_4038_d710de212097 -->|method| 6603fb43_ff6f_ad94_0e94_0f152d804075
  c6198a58_c2ac_3eb3_3e9d_7a26c6ff0e76["buildUpdateSet()"]
  9c5eee4c_4b78_a585_4038_d710de212097 -->|method| c6198a58_c2ac_3eb3_3e9d_7a26c6ff0e76
  8f9fa658_edb5_f102_51bb_be11ee53973b["buildUpdateQuery()"]
  9c5eee4c_4b78_a585_4038_d710de212097 -->|method| 8f9fa658_edb5_f102_51bb_be11ee53973b
  d2bb0977_2845_5bd0_d019_e55f619ef7e8["buildSelection()"]
  9c5eee4c_4b78_a585_4038_d710de212097 -->|method| d2bb0977_2845_5bd0_d019_e55f619ef7e8
  6b198fad_61da_d3c6_6497_9634ac05c48a["buildLimit()"]
  9c5eee4c_4b78_a585_4038_d710de212097 -->|method| 6b198fad_61da_d3c6_6497_9634ac05c48a
  1a6d3dd7_66dd_323c_34ba_58c1bebc1ede["buildOrderBy()"]
  9c5eee4c_4b78_a585_4038_d710de212097 -->|method| 1a6d3dd7_66dd_323c_34ba_58c1bebc1ede
  7c20c441_cfa6_cf8b_7c30_26d754c4801b["buildIndex()"]
  9c5eee4c_4b78_a585_4038_d710de212097 -->|method| 7c20c441_cfa6_cf8b_7c30_26d754c4801b

Relationship Graph

Source Code

drizzle-orm/src/mysql-core/dialect.ts lines 44–1169

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

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

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

	async migrate(
		migrations: MigrationMeta[],
		session: MySqlSession,
		config: Omit<MigrationConfig, 'migrationsSchema'>,
	): Promise<void> {
		const migrationsTable = config.migrationsTable ?? '__drizzle_migrations';
		const migrationTableCreate = sql`
			create table if not exists ${sql.identifier(migrationsTable)} (
				id serial primary key,
				hash text not null,
				created_at bigint
			)
		`;
		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(migrationsTable)} order by created_at desc limit 1`,
		);

		const lastDbMigration = dbMigrations[0];

		await session.transaction(async (tx) => {
			for (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(migrationsTable)
						} (\`hash\`, \`created_at\`) values(${migration.hash}, ${migration.folderMillis})`,
					);
				}
			}
		});
	}

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

	escapeParam(_num: number): string {
		return `?`;
	}

	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, limit, orderBy }: MySqlDeleteConfig): SQL {
		const withSql = this.buildWithCTE(withList);

		const returningSql = returning
			? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}`

Domain

Frequently Asked Questions

What is the MySqlDialect class?
MySqlDialect is a class in the drizzle-orm codebase, defined in drizzle-orm/src/mysql-core/dialect.ts.
Where is MySqlDialect defined?
MySqlDialect is defined in drizzle-orm/src/mysql-core/dialect.ts at line 44.

Analyze Your Own Codebase

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

Try Supermodel Free