Home / Function/ extractTablesRelationalConfig() — drizzle-orm Function Reference

extractTablesRelationalConfig() — drizzle-orm Function Reference

Architecture documentation for the extractTablesRelationalConfig() function in relations.ts from the drizzle-orm codebase.

Entity Profile

Dependency Diagram

graph TD
  910b7f81_1088_02ad_1eb1_cd8ed92bd0b4["extractTablesRelationalConfig()"]
  2f47d090_425d_2e56_2395_4c4d912316f0["relations.ts"]
  910b7f81_1088_02ad_1eb1_cd8ed92bd0b4 -->|defined in| 2f47d090_425d_2e56_2395_4c4d912316f0
  c020d230_75a2_3639_d9a6_35f2ba7fd5bc["is()"]
  910b7f81_1088_02ad_1eb1_cd8ed92bd0b4 -->|calls| c020d230_75a2_3639_d9a6_35f2ba7fd5bc
  style 910b7f81_1088_02ad_1eb1_cd8ed92bd0b4 fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

drizzle-orm/src/relations.ts lines 416–500

export function extractTablesRelationalConfig<
	TTables extends TablesRelationalConfig,
>(
	schema: Record<string, unknown>,
	configHelpers: (table: Table) => any,
): { tables: TTables; tableNamesMap: Record<string, string> } {
	if (
		Object.keys(schema).length === 1
		&& 'default' in schema
		&& !is(schema['default'], Table)
	) {
		schema = schema['default'] as Record<string, unknown>;
	}

	// table DB name -> schema table key
	const tableNamesMap: Record<string, string> = {};
	// Table relations found before their tables - need to buffer them until we know the schema table key
	const relationsBuffer: Record<
		string,
		{ relations: Record<string, Relation>; primaryKey?: AnyColumn[] }
	> = {};
	const tablesConfig: TablesRelationalConfig = {};
	for (const [key, value] of Object.entries(schema)) {
		if (is(value, Table)) {
			const dbName = getTableUniqueName(value);
			const bufferedRelations = relationsBuffer[dbName];
			tableNamesMap[dbName] = key;
			tablesConfig[key] = {
				tsName: key,
				dbName: value[Table.Symbol.Name],
				schema: value[Table.Symbol.Schema],
				columns: value[Table.Symbol.Columns],
				relations: bufferedRelations?.relations ?? {},
				primaryKey: bufferedRelations?.primaryKey ?? [],
			};

			// Fill in primary keys
			for (
				const column of Object.values(
					(value as Table)[Table.Symbol.Columns],
				)
			) {
				if (column.primary) {
					tablesConfig[key]!.primaryKey.push(column);
				}
			}

			const extraConfig = value[Table.Symbol.ExtraConfigBuilder]?.((value as Table)[Table.Symbol.ExtraConfigColumns]);
			if (extraConfig) {
				for (const configEntry of Object.values(extraConfig)) {
					if (is(configEntry, PrimaryKeyBuilder)) {
						tablesConfig[key]!.primaryKey.push(...configEntry.columns);
					}
				}
			}
		} else if (is(value, Relations)) {
			const dbName = getTableUniqueName(value.table);
			const tableName = tableNamesMap[dbName];
			const relations: Record<string, Relation> = value.config(
				configHelpers(value.table),
			);
			let primaryKey: AnyColumn[] | undefined;

			for (const [relationName, relation] of Object.entries(relations)) {
				if (tableName) {
					const tableConfig = tablesConfig[tableName]!;
					tableConfig.relations[relationName] = relation;
					if (primaryKey) {
						tableConfig.primaryKey.push(...primaryKey);
					}
				} else {
					if (!(dbName in relationsBuffer)) {
						relationsBuffer[dbName] = {
							relations: {},
							primaryKey,
						};
					}
					relationsBuffer[dbName]!.relations[relationName] = relation;
				}
			}
		}

Domain

Subdomains

Calls

Frequently Asked Questions

What does extractTablesRelationalConfig() do?
extractTablesRelationalConfig() is a function in the drizzle-orm codebase, defined in drizzle-orm/src/relations.ts.
Where is extractTablesRelationalConfig() defined?
extractTablesRelationalConfig() is defined in drizzle-orm/src/relations.ts at line 416.
What does extractTablesRelationalConfig() call?
extractTablesRelationalConfig() calls 1 function(s): is.

Analyze Your Own Codebase

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

Try Supermodel Free