Browse Source

fix: primary key operations for sqlite

Signed-off-by: mertmit <mertmit99@gmail.com>
pull/3668/head
mertmit 2 years ago
parent
commit
db70140ef1
  1. 97
      packages/nocodb/src/lib/db/sql-client/lib/sqlite/SqliteClient.ts

97
packages/nocodb/src/lib/db/sql-client/lib/sqlite/SqliteClient.ts

@ -1495,7 +1495,7 @@ class SqliteClient extends KnexClient {
cn: args.columns[i].cno, cn: args.columns[i].cno,
}); });
if (args.columns[i].altered & 4) { if (!args.columns[i].pk && args.columns[i].altered & 4) {
// col remove // col remove
upQuery += this.alterTableRemoveColumn( upQuery += this.alterTableRemoveColumn(
args.table, args.table,
@ -1544,13 +1544,7 @@ class SqliteClient extends KnexClient {
} }
} }
upQuery += this.alterTablePK( const pkQuery = this.alterTablePK(args.columns, args.originalColumns, upQuery);
args.columns,
args.originalColumns,
upQuery,
this.sqlClient
);
//downQuery += alterTablePK(args.originalColumns, args.columns, downQuery);
const trx = await this.sqlClient.transaction(); const trx = await this.sqlClient.transaction();
@ -1562,6 +1556,22 @@ class SqliteClient extends KnexClient {
} }
} }
if (pkQuery) {
await trx.schema.alterTable(args.table, (table) => {
for (const pk of pkQuery.oldPks.filter((el) => !pkQuery.newPks.includes(el))) {
table.dropPrimary(pk);
}
for (const pk of pkQuery.dropPks) {
table.dropColumn(pk);
}
if (pkQuery.newPks.length) {
table.primary(pkQuery.newPks);
}
});
}
await trx.commit(); await trx.commit();
} catch (e) { } catch (e) {
await trx.rollback(); await trx.rollback();
@ -1876,50 +1886,61 @@ class SqliteClient extends KnexClient {
return result; return result;
} }
alterTablePK(n, o, _existingQuery, createTable = false) { createTablePK(n, _existingQuery) {
const numOfPksInOriginal = []; const newPks = [];
const numOfPksInNew = [];
let pksChanged = 0; for (let i = 0; i < n.length; ++i) {
if (n[i].pk) {
if (n[i].altered !== 4) newPks.push(n[i].cn);
}
}
let query = '';
if (newPks.length) {
query += this.genQuery(`, PRIMARY KEY(??)`, [newPks]);
}
return query;
}
alterTablePK(n, o, _existingQuery) {
const newPks = [];
const oldPks = [];
const dropPks = [];
let pksChanged = false;
for (let i = 0; i < n.length; ++i) { for (let i = 0; i < n.length; ++i) {
if (n[i].pk) { if (n[i].pk) {
if (n[i].altered !== 4) numOfPksInNew.push(n[i].cn); if (n[i].altered !== 4) {
newPks.push(n[i].cn);
} else {
dropPks.push(n[i].cn);
}
pksChanged = true;
} }
} }
for (let i = 0; i < o.length; ++i) { for (let i = 0; i < o.length; ++i) {
if (o[i].pk) { if (o[i].pk) {
numOfPksInOriginal.push(o[i].cn); oldPks.push(o[i].cn);
} }
} }
if (numOfPksInNew.length === numOfPksInOriginal.length) { if (newPks.length === oldPks.length) {
for (let i = 0; i < numOfPksInNew.length; ++i) { if (newPks.every((pk) => oldPks.includes(pk)) && dropPks.length === 0) {
if (numOfPksInOriginal[i] !== numOfPksInNew[i]) { pksChanged = false;
pksChanged = 1;
break;
}
} }
} else {
pksChanged = numOfPksInNew.length - numOfPksInOriginal.length;
} }
let query = ''; if (pksChanged) {
if (!numOfPksInNew.length && !numOfPksInOriginal.length) { return {
// do nothing newPks,
} else if (pksChanged) { oldPks,
query += numOfPksInOriginal.length ? ',DROP PRIMARY KEY' : ''; dropPks,
if (numOfPksInNew.length) {
if (createTable) {
query += this.genQuery(`, PRIMARY KEY(??)`, [numOfPksInNew]);
} else {
query += this.genQuery(`, ADD PRIMARY KEY(??)`, [numOfPksInNew]);
}
} }
} else {
return false;
} }
return query;
} }
alterTableRemoveColumn(t, n, _o, existingQuery) { alterTableRemoveColumn(t, n, _o, existingQuery) {
@ -1952,7 +1973,7 @@ class SqliteClient extends KnexClient {
query += this.createTableColumn(table, args.columns[i], null, query); query += this.createTableColumn(table, args.columns[i], null, query);
} }
query += this.alterTablePK(args.columns, [], query, true); query += this.createTablePK(args.columns, query);
query = this.genQuery(`CREATE TABLE ?? (${query});`, [args.tn]); query = this.genQuery(`CREATE TABLE ?? (${query});`, [args.tn]);
@ -1993,7 +2014,7 @@ class SqliteClient extends KnexClient {
query += n.dtxp && n.dt !== 'text' ? `(${n.dtxp})` : ''; query += n.dtxp && n.dt !== 'text' ? `(${n.dtxp})` : '';
query += n.cdf query += n.cdf
? ` DEFAULT ${n.cdf}` ? ` DEFAULT ${n.cdf}`
: !n.rqd ? ' ' : ` DEFAULT ''`; : ' ';
query += n.rqd ? ` NOT NULL` : ' '; query += n.rqd ? ` NOT NULL` : ' ';
} else if (change === 1) { } else if (change === 1) {
shouldSanitize = true; shouldSanitize = true;

Loading…
Cancel
Save