feat: naming strategy (#19848)

* feat: naming strategy

* feat: detect renames
This commit is contained in:
Jason Rasmussen
2025-07-11 11:35:10 -04:00
committed by GitHub
parent 1d19d308e2
commit 9e48ae3052
35 changed files with 517 additions and 127 deletions

View File

@@ -5,6 +5,7 @@ import { describe, expect, it } from 'vitest';
const testColumn: DatabaseColumn = {
name: 'test',
tableName: 'table1',
primary: false,
nullable: false,
isArray: false,
type: 'character varying',

View File

@@ -1,7 +1,32 @@
import { getColumnType, isDefaultEqual } from 'src/sql-tools/helpers';
import { asRenameKey, getColumnType, isDefaultEqual } from 'src/sql-tools/helpers';
import { Comparer, DatabaseColumn, Reason, SchemaDiff } from 'src/sql-tools/types';
export const compareColumns: Comparer<DatabaseColumn> = {
export const compareColumns = {
getRenameKey: (column) => {
return asRenameKey([
column.tableName,
column.type,
column.nullable,
column.default,
column.storage,
column.primary,
column.isArray,
column.length,
column.identity,
column.enumName,
column.numericPrecision,
column.numericScale,
]);
},
onRename: (source, target) => [
{
type: 'ColumnRename',
tableName: source.tableName,
oldName: target.name,
newName: source.name,
reason: Reason.Rename,
},
],
onMissing: (source) => [
{
type: 'ColumnAdd',
@@ -67,7 +92,7 @@ export const compareColumns: Comparer<DatabaseColumn> = {
return items;
},
};
} satisfies Comparer<DatabaseColumn>;
const dropAndRecreateColumn = (source: DatabaseColumn, target: DatabaseColumn, reason: string): SchemaDiff[] => {
return [

View File

@@ -1,4 +1,4 @@
import { haveEqualColumns } from 'src/sql-tools/helpers';
import { asRenameKey, haveEqualColumns } from 'src/sql-tools/helpers';
import {
CompareFunction,
Comparer,
@@ -13,6 +13,37 @@ import {
} from 'src/sql-tools/types';
export const compareConstraints: Comparer<DatabaseConstraint> = {
getRenameKey: (constraint) => {
switch (constraint.type) {
case ConstraintType.PRIMARY_KEY:
case ConstraintType.UNIQUE: {
return asRenameKey([constraint.type, constraint.tableName, ...constraint.columnNames.toSorted()]);
}
case ConstraintType.FOREIGN_KEY: {
return asRenameKey([
constraint.type,
constraint.tableName,
...constraint.columnNames.toSorted(),
constraint.referenceTableName,
...constraint.referenceColumnNames.toSorted(),
]);
}
case ConstraintType.CHECK: {
return asRenameKey([constraint.type, constraint.tableName, constraint.expression]);
}
}
},
onRename: (source, target) => [
{
type: 'ConstraintRename',
tableName: target.tableName,
oldName: target.name,
newName: source.name,
reason: Reason.Rename,
},
],
onMissing: (source) => [
{
type: 'ConstraintAdd',

View File

@@ -1,7 +1,23 @@
import { haveEqualColumns } from 'src/sql-tools/helpers';
import { asRenameKey, haveEqualColumns } from 'src/sql-tools/helpers';
import { Comparer, DatabaseIndex, Reason } from 'src/sql-tools/types';
export const compareIndexes: Comparer<DatabaseIndex> = {
getRenameKey: (index) => {
if (index.override) {
return index.override.value.sql.replace(index.name, 'INDEX_NAME');
}
return asRenameKey([index.tableName, ...(index.columnNames || []).toSorted(), index.unique]);
},
onRename: (source, target) => [
{
type: 'IndexRename',
tableName: source.tableName,
oldName: target.name,
newName: source.name,
reason: Reason.Rename,
},
],
onMissing: (source) => [
{
type: 'IndexCreate',