Browse Source

Merge pull request #3611 from nocodb/fix/3033-meta-sync-ltar-delete

fix(api): apply column changes in order
pull/3714/head
աɨռɢӄաօռɢ 2 years ago committed by GitHub
parent
commit
74686f559d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 14
      packages/nocodb/src/lib/meta/api/metaDiffApis.ts
  2. 22
      packages/nocodb/src/lib/models/Column.ts

14
packages/nocodb/src/lib/meta/api/metaDiffApis.ts

@ -34,6 +34,11 @@ export enum MetaDiffType {
TABLE_VIRTUAL_M2M_REMOVE = 'TABLE_VIRTUAL_M2M_REMOVE',
}
const applyChangesPriorityOrder = [
MetaDiffType.VIEW_COLUMN_REMOVE,
MetaDiffType.TABLE_RELATION_REMOVE,
];
type MetaDiff = {
title?: string;
table_name: string;
@ -549,6 +554,15 @@ export async function metaDiffSync(req, res) {
// const relations = (await sqlClient.relationListAll())?.data?.list;
for (const { table_name, detectedChanges } of changes) {
// reorder changes to apply relation remove changes
// before column remove to avoid foreign key constraint error
detectedChanges.sort((a, b) => {
return (
applyChangesPriorityOrder.indexOf(b.type) -
applyChangesPriorityOrder.indexOf(a.type)
);
});
for (const change of detectedChanges) {
switch (change.type) {
case MetaDiffType.TABLE_NEW:

22
packages/nocodb/src/lib/models/Column.ts

@ -772,6 +772,28 @@ export default class Column<T = any> implements ColumnType {
await NocoCache.del(`${CacheScope.GALLERY_VIEW_COLUMN}:${col.id}`);
}
// Get LTAR columns in which current column is referenced as foreign key
const ltarColumns = await ncMeta.metaList2(
null,
null,
MetaTable.COL_RELATIONS,
{
xcCondition: {
_or: [
{ fk_child_column_id: { eq: col.id } },
{ fk_parent_column_id: { eq: col.id } },
{ fk_mm_child_column_id: { eq: col.id } },
{ fk_mm_parent_column_id: { eq: col.id } },
],
},
}
);
// Delete LTAR columns in which current column is referenced as foreign key
for (const ltarColumn of ltarColumns) {
await Column.delete(ltarColumn.fk_column_id, ncMeta);
}
// Columns
await ncMeta.metaDelete(null, null, MetaTable.COLUMNS, col.id);
await NocoCache.deepDel(

Loading…
Cancel
Save