Browse Source

Merge pull request #7434 from nocodb/nc-fix/mm-delete

fix: mm table deletion
pull/7437/head
Mert E 10 months ago committed by GitHub
parent
commit
2c5c9fd3d5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 21
      packages/nocodb/src/db/sql-client/lib/pg/PgClient.ts
  2. 27
      packages/nocodb/src/services/columns.service.ts
  3. 3
      packages/nocodb/src/services/tables.service.ts

21
packages/nocodb/src/db/sql-client/lib/pg/PgClient.ts

@ -965,28 +965,13 @@ class PGClient extends KnexClient {
f.attnotnull as rqd, f.attnotnull as rqd,
p.contype as cst, p.contype as cst,
p.conname as cstn, p.conname as cstn,
ix.indisprimary as primarykey,
not ix.indisunique as non_unique_original,
not ix.indisunique as non_unique,
CASE CASE
WHEN i.oid<>0 THEN true WHEN i.oid<>0 THEN true
ELSE false ELSE false
END AS is_index, END AS is_index,
CASE
WHEN p.contype = 'p' THEN true
ELSE false
END AS primarykey,
CASE
WHEN p.contype = 'u' THEN 0
WHEN p.contype = 'p' THEN 0
ELSE 1
END AS non_unique_original,
CASE
WHEN p.contype = 'p' THEN true
ELSE false
END AS primarykey,
CASE
WHEN p.contype = 'u' THEN 0
WHEN p.contype = 'p' THEN 0
ELSE 1
END AS non_unique,
CASE CASE
WHEN f.atthasdef = 't' THEN pg_get_expr(d.adbin, d.adrelid) WHEN f.atthasdef = 't' THEN pg_get_expr(d.adbin, d.adrelid)
END AS default FROM pg_attribute f END AS default FROM pg_attribute f

27
packages/nocodb/src/services/columns.service.ts

@ -2059,6 +2059,7 @@ export class ColumnsService {
req?: any; req?: any;
columnId: string; columnId: string;
user: UserType; user: UserType;
forceDeleteSystem?: boolean;
reuse?: ReusableParams; reuse?: ReusableParams;
}, },
ncMeta = this.metaService, ncMeta = this.metaService,
@ -2067,7 +2068,7 @@ export class ColumnsService {
const column = await Column.get({ colId: param.columnId }, ncMeta); const column = await Column.get({ colId: param.columnId }, ncMeta);
if (column.system) { if (column.system && !param.forceDeleteSystem) {
NcError.badRequest( NcError.badRequest(
`The column '${ `The column '${
column.title || column.column_name column.title || column.column_name
@ -2178,9 +2179,11 @@ export class ColumnsService {
colOpt.type === 'mm' && colOpt.type === 'mm' &&
colOpt.fk_parent_column_id === childColumn.id && colOpt.fk_parent_column_id === childColumn.id &&
colOpt.fk_child_column_id === parentColumn.id && colOpt.fk_child_column_id === parentColumn.id &&
colOpt.fk_mm_model_id === mmTable.id && colOpt.fk_mm_model_id === relationColOpt.fk_mm_model_id &&
colOpt.fk_mm_parent_column_id === mmChildCol.id && colOpt.fk_mm_parent_column_id ===
colOpt.fk_mm_child_column_id === mmParentCol.id relationColOpt.fk_mm_child_column_id &&
colOpt.fk_mm_child_column_id ===
relationColOpt.fk_mm_parent_column_id
) { ) {
await Column.delete(c.id, ncMeta); await Column.delete(c.id, ncMeta);
break; break;
@ -2189,6 +2192,7 @@ export class ColumnsService {
await Column.delete(relationColOpt.fk_column_id, ncMeta); await Column.delete(relationColOpt.fk_column_id, ncMeta);
if (mmTable) {
// delete bt columns in m2m table // delete bt columns in m2m table
await mmTable.getColumns(ncMeta); await mmTable.getColumns(ncMeta);
for (const c of mmTable.columns) { for (const c of mmTable.columns) {
@ -2199,6 +2203,7 @@ export class ColumnsService {
await Column.delete(c.id, ncMeta); await Column.delete(c.id, ncMeta);
} }
} }
}
// delete hm columns in parent table // delete hm columns in parent table
await parentTable.getColumns(ncMeta); await parentTable.getColumns(ncMeta);
@ -2206,7 +2211,9 @@ export class ColumnsService {
if (!isLinksOrLTAR(c.uidt)) continue; if (!isLinksOrLTAR(c.uidt)) continue;
const colOpt = const colOpt =
await c.getColOptions<LinkToAnotherRecordColumn>(ncMeta); await c.getColOptions<LinkToAnotherRecordColumn>(ncMeta);
if (colOpt.fk_related_model_id === mmTable.id) { if (
colOpt.fk_related_model_id === relationColOpt.fk_mm_model_id
) {
await Column.delete(c.id, ncMeta); await Column.delete(c.id, ncMeta);
} }
} }
@ -2217,11 +2224,14 @@ export class ColumnsService {
if (!isLinksOrLTAR(c.uidt)) continue; if (!isLinksOrLTAR(c.uidt)) continue;
const colOpt = const colOpt =
await c.getColOptions<LinkToAnotherRecordColumn>(ncMeta); await c.getColOptions<LinkToAnotherRecordColumn>(ncMeta);
if (colOpt.fk_related_model_id === mmTable.id) { if (
colOpt.fk_related_model_id === relationColOpt.fk_mm_model_id
) {
await Column.delete(c.id, ncMeta); await Column.delete(c.id, ncMeta);
} }
} }
if (mmTable) {
// retrieve columns in m2m table again // retrieve columns in m2m table again
await mmTable.getColumns(ncMeta); await mmTable.getColumns(ncMeta);
@ -2233,6 +2243,7 @@ export class ColumnsService {
await mmTable.delete(ncMeta); await mmTable.delete(ncMeta);
} }
} }
}
break; break;
} }
} }
@ -2340,6 +2351,7 @@ export class ColumnsService {
}, },
ignoreFkDelete = false, ignoreFkDelete = false,
) => { ) => {
if (childTable) {
let foreignKeyName; let foreignKeyName;
// if relationColOpt is not provided, extract it from child table // if relationColOpt is not provided, extract it from child table
@ -2378,6 +2390,7 @@ export class ColumnsService {
console.log(e.message); console.log(e.message);
} }
} }
}
if (!relationColOpt) return; if (!relationColOpt) return;
const columnsInRelatedTable: Column[] = await relationColOpt const columnsInRelatedTable: Column[] = await relationColOpt
@ -2424,7 +2437,7 @@ export class ColumnsService {
...index, ...index,
tn: cTable.table_name, tn: cTable.table_name,
columns: [childColumn.column_name], columns: [childColumn.column_name],
indexName: index.index_name, indexName: index.key_name,
}); });
} }
} }

3
packages/nocodb/src/services/tables.service.ts

@ -202,7 +202,7 @@ export class TablesService {
// delete all relations // delete all relations
for (const c of relationColumns) { for (const c of relationColumns) {
// skip if column is hasmany relation to mm table // skip if column is hasmany relation to mm table
if (c.system) { if (c.system && !table.mm) {
continue; continue;
} }
@ -216,6 +216,7 @@ export class TablesService {
req: param.req, req: param.req,
columnId: c.id, columnId: c.id,
user: param.user, user: param.user,
forceDeleteSystem: true,
}, },
ncMeta, ncMeta,
); );

Loading…
Cancel
Save