fix(cm): update to bigint
This commit is contained in:
parent
c52f451840
commit
c888d793ee
@ -0,0 +1,145 @@
|
||||
import { DataTypes } from '@nocobase/database';
|
||||
import { Migration } from '@nocobase/server';
|
||||
|
||||
export default class UpdateIdToBigIntMigrator extends Migration {
|
||||
async up() {
|
||||
const db = this.app.db;
|
||||
|
||||
await db.getCollection('fields').repository.update({
|
||||
filter: {
|
||||
name: 'id',
|
||||
type: 'integer',
|
||||
},
|
||||
values: {
|
||||
type: 'bigInt',
|
||||
},
|
||||
});
|
||||
|
||||
if (!db.inDialect('mysql', 'postgres')) {
|
||||
return;
|
||||
}
|
||||
|
||||
const models = [];
|
||||
|
||||
const queryInterface = db.sequelize.getQueryInterface() as any;
|
||||
|
||||
const queryGenerator = queryInterface.queryGenerator as any;
|
||||
|
||||
const updateToBigInt = async (model, fieldName) => {
|
||||
let sql;
|
||||
|
||||
const tableName = model.tableName;
|
||||
if (model.rawAttributes[fieldName].type instanceof DataTypes.INTEGER) {
|
||||
if (db.inDialect('postgres')) {
|
||||
sql = `ALTER TABLE "${tableName}" ALTER COLUMN "${fieldName}" SET DATA TYPE BIGINT;`;
|
||||
} else if (db.inDialect('mysql')) {
|
||||
const dataTypeOrOptions = model.rawAttributes[fieldName];
|
||||
const attributeName = fieldName;
|
||||
|
||||
const query = queryGenerator.attributesToSQL(
|
||||
{
|
||||
[attributeName]: queryInterface.normalizeAttribute({
|
||||
...dataTypeOrOptions,
|
||||
type: DataTypes.BIGINT,
|
||||
}),
|
||||
},
|
||||
{
|
||||
context: 'changeColumn',
|
||||
table: tableName,
|
||||
},
|
||||
);
|
||||
sql = queryGenerator.changeColumnQuery(tableName, query);
|
||||
|
||||
sql = sql.replace(' PRIMARY KEY;', ' ;');
|
||||
}
|
||||
|
||||
try {
|
||||
await this.sequelize.query(sql, {});
|
||||
} catch (err) {
|
||||
if (err.message.includes('does not exist')) {
|
||||
return;
|
||||
}
|
||||
throw err;
|
||||
}
|
||||
|
||||
this.app.log.info(`updated ${tableName}.${fieldName} to BIGINT`, tableName, fieldName);
|
||||
}
|
||||
};
|
||||
|
||||
//@ts-ignore
|
||||
this.app.db.sequelize.modelManager.forEachModel((model) => {
|
||||
models.push(model);
|
||||
});
|
||||
|
||||
for (const model of models) {
|
||||
try {
|
||||
const primaryKeyField = model.tableAttributes[model.primaryKeyField];
|
||||
|
||||
const collection = db.modelCollection.get(model);
|
||||
|
||||
if (!collection) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (primaryKeyField && primaryKeyField.primaryKey) {
|
||||
await updateToBigInt(model, model.primaryKeyField);
|
||||
}
|
||||
|
||||
if (model.tableAttributes['sort'] && model.tableAttributes['sort'].type instanceof DataTypes.INTEGER) {
|
||||
await updateToBigInt(model, 'sort');
|
||||
}
|
||||
|
||||
const associations = model.associations;
|
||||
for (const associationName of Object.keys(associations)) {
|
||||
const association = associations[associationName];
|
||||
|
||||
const type = association.associationType;
|
||||
let foreignModel;
|
||||
let fieldName;
|
||||
|
||||
if (type === 'BelongsTo') {
|
||||
foreignModel = association.source;
|
||||
fieldName = association.foreignKey;
|
||||
}
|
||||
|
||||
if (type === 'HasMany') {
|
||||
foreignModel = association.target;
|
||||
fieldName = association.foreignKey;
|
||||
}
|
||||
|
||||
if (type === 'HasOne') {
|
||||
foreignModel = association.target;
|
||||
fieldName = association.foreignKey;
|
||||
}
|
||||
|
||||
if (foreignModel && fieldName) {
|
||||
const cf = await db.getRepository<any>('collections.fields', foreignModel.name).findOne({
|
||||
filterByTk: fieldName,
|
||||
});
|
||||
if (cf) {
|
||||
cf.interface = 'integer';
|
||||
cf.type = 'bigInt';
|
||||
await cf.save();
|
||||
}
|
||||
await updateToBigInt(foreignModel, fieldName);
|
||||
}
|
||||
|
||||
if (type === 'BelongsToMany') {
|
||||
const throughModel = association.through.model;
|
||||
const otherKey = association.otherKey;
|
||||
const foreignKey = association.foreignKey;
|
||||
|
||||
await updateToBigInt(throughModel, otherKey);
|
||||
await updateToBigInt(throughModel, foreignKey);
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
if (error.message.includes('cannot alter inherited column')) {
|
||||
continue;
|
||||
}
|
||||
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user