Skip to content

Commit

Permalink
bug fix
Browse files Browse the repository at this point in the history
  • Loading branch information
OleksiiKH0240 committed Jan 27, 2025
1 parent f36e3ea commit 32b71c0
Showing 1 changed file with 167 additions and 119 deletions.
286 changes: 167 additions & 119 deletions drizzle-seed/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -615,47 +615,63 @@ const getPostgresInfo = (
const schemaConfig = extractTablesRelationalConfig(schema, createTableRelationsHelpers);
const relations: RelationWithReferences[] = [];
for (const table of Object.values(schemaConfig.tables)) {
if (table.relations !== undefined) {
for (const drizzleRel of Object.values(table.relations)) {
if (is(drizzleRel, One)) {
const tableConfig = getPgTableConfig(drizzleRel.sourceTable as PgTable);
const tableDbSchema = tableConfig.schema ?? 'public';
const tableDbName = tableConfig.name;
const tableTsName = schemaConfig.tableNamesMap[`${tableDbSchema}.${tableDbName}`] ?? tableDbName;

const dbToTsColumnNamesMap = getDbToTsColumnNamesMap(drizzleRel.sourceTable);
const columns = drizzleRel.config?.fields.map((field) => dbToTsColumnNamesMap[field.name] as string)
?? [];

const refTableConfig = getPgTableConfig(drizzleRel.referencedTable as PgTable);
const refTableDbSchema = refTableConfig.schema ?? 'public';
const refTableDbName = refTableConfig.name;
const refTableTsName = schemaConfig.tableNamesMap[`${refTableDbSchema}.${refTableDbName}`]
?? refTableDbName;

const dbToTsColumnNamesMapForRefTable = getDbToTsColumnNamesMap(drizzleRel.referencedTable);
const refColumns = drizzleRel.config?.references.map((ref) =>
dbToTsColumnNamesMapForRefTable[ref.name] as string
)
?? [];

if (tableRelations[refTableTsName] === undefined) {
tableRelations[refTableTsName] = [];
}

const relation: RelationWithReferences = {
table: tableTsName,
columns,
refTable: refTableTsName,
refColumns,
refTableRels: tableRelations[refTableTsName],
type: 'one',
};

relations.push(relation);
tableRelations[tableTsName]!.push(relation);
}
if (table.relations === undefined) continue;

for (const drizzleRel of Object.values(table.relations)) {
if (!is(drizzleRel, One)) continue;

const tableConfig = getPgTableConfig(drizzleRel.sourceTable as PgTable);
const tableDbSchema = tableConfig.schema ?? 'public';
const tableDbName = tableConfig.name;
const tableTsName = schemaConfig.tableNamesMap[`${tableDbSchema}.${tableDbName}`] ?? tableDbName;

const dbToTsColumnNamesMap = getDbToTsColumnNamesMap(drizzleRel.sourceTable);
const columns = drizzleRel.config?.fields.map((field) => dbToTsColumnNamesMap[field.name] as string)
?? [];

const refTableConfig = getPgTableConfig(drizzleRel.referencedTable as PgTable);
const refTableDbSchema = refTableConfig.schema ?? 'public';
const refTableDbName = refTableConfig.name;
const refTableTsName = schemaConfig.tableNamesMap[`${refTableDbSchema}.${refTableDbName}`]
?? refTableDbName;

const dbToTsColumnNamesMapForRefTable = getDbToTsColumnNamesMap(drizzleRel.referencedTable);
const refColumns = drizzleRel.config?.references.map((ref) =>
dbToTsColumnNamesMapForRefTable[ref.name] as string
)
?? [];

if (tableRelations[refTableTsName] === undefined) {
tableRelations[refTableTsName] = [];
}

const relation: RelationWithReferences = {
table: tableTsName,
columns,
refTable: refTableTsName,
refColumns,
refTableRels: tableRelations[refTableTsName],
type: 'one',
};

// do not add duplicate relation
if (
tableRelations[tableTsName]?.some((rel) =>
rel.table === relation.table
&& rel.refTable === relation.refTable
) === true
) {
console.warn(
`You are providing a one-to-many relation from the '${relation.table}' table to the '${relation.refTable}' table,\n`
+ `while your '${relation.table}' table object already has foreign key constraint in the schema(from the '${relation.table}' table to the '${relation.refTable}' table).\n`
+ `You can specify either the foreign key constraint or the relation, but not both.\n`
+ `By default, one-to-many relation will be ignored to respect foreign key constraint.\n`,
);
continue;
}

relations.push(relation);
tableRelations[tableTsName]!.push(relation);
}
}
return relations;
Expand Down Expand Up @@ -993,47 +1009,63 @@ const getMySqlInfo = (
const schemaConfig = extractTablesRelationalConfig(schema, createTableRelationsHelpers);
const relations: RelationWithReferences[] = [];
for (const table of Object.values(schemaConfig.tables)) {
if (table.relations !== undefined) {
for (const drizzleRel of Object.values(table.relations)) {
if (is(drizzleRel, One)) {
const tableConfig = getMysqlTableConfig(drizzleRel.sourceTable as MySqlTable);
const tableDbSchema = tableConfig.schema ?? 'public';
const tableDbName = tableConfig.name;
const tableTsName = schemaConfig.tableNamesMap[`${tableDbSchema}.${tableDbName}`] ?? tableDbName;

const dbToTsColumnNamesMap = getDbToTsColumnNamesMap(drizzleRel.sourceTable as MySqlTable);
const columns = drizzleRel.config?.fields.map((field) => dbToTsColumnNamesMap[field.name] as string)
?? [];

const refTableConfig = getMysqlTableConfig(drizzleRel.referencedTable as MySqlTable);
const refTableDbSchema = refTableConfig.schema ?? 'public';
const refTableDbName = refTableConfig.name;
const refTableTsName = schemaConfig.tableNamesMap[`${refTableDbSchema}.${refTableDbName}`]
?? refTableDbName;

const dbToTsColumnNamesMapForRefTable = getDbToTsColumnNamesMap(drizzleRel.referencedTable as MySqlTable);
const refColumns = drizzleRel.config?.references.map((ref) =>
dbToTsColumnNamesMapForRefTable[ref.name] as string
)
?? [];

if (tableRelations[refTableTsName] === undefined) {
tableRelations[refTableTsName] = [];
}

const relation: RelationWithReferences = {
table: tableTsName,
columns,
refTable: refTableTsName,
refColumns,
refTableRels: tableRelations[refTableTsName],
type: 'one',
};

relations.push(relation);
tableRelations[tableTsName]!.push(relation);
}
if (table.relations === undefined) continue;

for (const drizzleRel of Object.values(table.relations)) {
if (!is(drizzleRel, One)) continue;

const tableConfig = getMysqlTableConfig(drizzleRel.sourceTable as MySqlTable);
const tableDbSchema = tableConfig.schema ?? 'public';
const tableDbName = tableConfig.name;
const tableTsName = schemaConfig.tableNamesMap[`${tableDbSchema}.${tableDbName}`] ?? tableDbName;

const dbToTsColumnNamesMap = getDbToTsColumnNamesMap(drizzleRel.sourceTable as MySqlTable);
const columns = drizzleRel.config?.fields.map((field) => dbToTsColumnNamesMap[field.name] as string)
?? [];

const refTableConfig = getMysqlTableConfig(drizzleRel.referencedTable as MySqlTable);
const refTableDbSchema = refTableConfig.schema ?? 'public';
const refTableDbName = refTableConfig.name;
const refTableTsName = schemaConfig.tableNamesMap[`${refTableDbSchema}.${refTableDbName}`]
?? refTableDbName;

const dbToTsColumnNamesMapForRefTable = getDbToTsColumnNamesMap(drizzleRel.referencedTable as MySqlTable);
const refColumns = drizzleRel.config?.references.map((ref) =>
dbToTsColumnNamesMapForRefTable[ref.name] as string
)
?? [];

if (tableRelations[refTableTsName] === undefined) {
tableRelations[refTableTsName] = [];
}

const relation: RelationWithReferences = {
table: tableTsName,
columns,
refTable: refTableTsName,
refColumns,
refTableRels: tableRelations[refTableTsName],
type: 'one',
};

// do not add duplicate relation
if (
tableRelations[tableTsName]?.some((rel) =>
rel.table === relation.table
&& rel.refTable === relation.refTable
) === true
) {
console.warn(
`You are providing a one-to-many relation from the '${relation.table}' table to the '${relation.refTable}' table,\n`
+ `while your '${relation.table}' table object already has foreign key constraint in the schema(from the '${relation.table}' table to the '${relation.refTable}' table).\n`
+ `You can specify either the foreign key constraint or the relation, but not both.\n`
+ `By default, one-to-many relation will be ignored to respect foreign key constraint.\n`,
);
continue;
}

relations.push(relation);
tableRelations[tableTsName]!.push(relation);
}
}
return relations;
Expand Down Expand Up @@ -1299,46 +1331,62 @@ const getSqliteInfo = (
const schemaConfig = extractTablesRelationalConfig(schema, createTableRelationsHelpers);
const relations: RelationWithReferences[] = [];
for (const table of Object.values(schemaConfig.tables)) {
if (table.relations !== undefined) {
for (const drizzleRel of Object.values(table.relations)) {
if (is(drizzleRel, One)) {
const tableConfig = getSqliteTableConfig(drizzleRel.sourceTable as SQLiteTable);
const tableDbName = tableConfig.name;
// TODO: tableNamesMap: have {public.customer: 'customer'} structure in sqlite
const tableTsName = schemaConfig.tableNamesMap[`public.${tableDbName}`] ?? tableDbName;

const dbToTsColumnNamesMap = getDbToTsColumnNamesMap(drizzleRel.sourceTable as SQLiteTable);
const columns = drizzleRel.config?.fields.map((field) => dbToTsColumnNamesMap[field.name] as string)
?? [];

const refTableConfig = getSqliteTableConfig(drizzleRel.referencedTable as SQLiteTable);
const refTableDbName = refTableConfig.name;
const refTableTsName = schemaConfig.tableNamesMap[`public.${refTableDbName}`]
?? refTableDbName;

const dbToTsColumnNamesMapForRefTable = getDbToTsColumnNamesMap(drizzleRel.referencedTable as SQLiteTable);
const refColumns = drizzleRel.config?.references.map((ref) =>
dbToTsColumnNamesMapForRefTable[ref.name] as string
)
?? [];

if (tableRelations[refTableTsName] === undefined) {
tableRelations[refTableTsName] = [];
}

const relation: RelationWithReferences = {
table: tableTsName,
columns,
refTable: refTableTsName,
refColumns,
refTableRels: tableRelations[refTableTsName],
type: 'one',
};

relations.push(relation);
tableRelations[tableTsName]!.push(relation);
}
if (table.relations === undefined) continue;

for (const drizzleRel of Object.values(table.relations)) {
if (!is(drizzleRel, One)) continue;

const tableConfig = getSqliteTableConfig(drizzleRel.sourceTable as SQLiteTable);
const tableDbName = tableConfig.name;
// TODO: tableNamesMap: have {public.customer: 'customer'} structure in sqlite
const tableTsName = schemaConfig.tableNamesMap[`public.${tableDbName}`] ?? tableDbName;

const dbToTsColumnNamesMap = getDbToTsColumnNamesMap(drizzleRel.sourceTable as SQLiteTable);
const columns = drizzleRel.config?.fields.map((field) => dbToTsColumnNamesMap[field.name] as string)
?? [];

const refTableConfig = getSqliteTableConfig(drizzleRel.referencedTable as SQLiteTable);
const refTableDbName = refTableConfig.name;
const refTableTsName = schemaConfig.tableNamesMap[`public.${refTableDbName}`]
?? refTableDbName;

const dbToTsColumnNamesMapForRefTable = getDbToTsColumnNamesMap(drizzleRel.referencedTable as SQLiteTable);
const refColumns = drizzleRel.config?.references.map((ref) =>
dbToTsColumnNamesMapForRefTable[ref.name] as string
)
?? [];

if (tableRelations[refTableTsName] === undefined) {
tableRelations[refTableTsName] = [];
}

const relation: RelationWithReferences = {
table: tableTsName,
columns,
refTable: refTableTsName,
refColumns,
refTableRels: tableRelations[refTableTsName],
type: 'one',
};

// do not add duplicate relation
if (
tableRelations[tableTsName]?.some((rel) =>
rel.table === relation.table
&& rel.refTable === relation.refTable
) === true
) {
console.warn(
`You are providing a one-to-many relation from the '${relation.table}' table to the '${relation.refTable}' table,\n`
+ `while your '${relation.table}' table object already has foreign key constraint in the schema(from the '${relation.table}' table to the '${relation.refTable}' table).\n`
+ `You can specify either the foreign key constraint or the relation, but not both.\n`
+ `By default, one-to-many relation will be ignored to respect foreign key constraint.\n`,
);
continue;
}

relations.push(relation);
tableRelations[tableTsName]!.push(relation);
}
}
return relations;
Expand Down

0 comments on commit 32b71c0

Please sign in to comment.