Есть много похожих вопросов, но я уже попробовал большинство предложенных решений без удачи.
У меня уже есть база данных (mysql), поэтому я пропустил определение модели и использовал sequelize-auto (programmatic).Первая проблема возникла с устаревшими зависимостями (sequelize-auto использует sequelize v3).
Модель, сгенерированная из существующей базы данных с помощью sequelize-auto (sequelize v3):
{
"id":{
"type":"INT(10) UNSIGNED",
"allowNull":false,
"defaultValue":null,
"primaryKey":true,
"foreignKey":{
"source_table":"db_name",
"source_schema":"db_name",
"target_schema":null,
"constraint_name":"PRIMARY",
"source_column":"id",
"target_table":null,
"target_column":null,
"extra":"",
"column_key":"PRI",
"isPrimaryKey":true
}
},
"name":{
"type":"VARCHAR(255)",
"allowNull":false,
"defaultValue":null,
"primaryKey":false
},
"start":{
"type":"DATE",
"allowNull":false,
"defaultValue":null,
"primaryKey":false
},
"end":{
"type":"DATE",
"allowNull":false,
"defaultValue":null,
"primaryKey":false
},
"active":{
"type":"TINYINT(1)",
"allowNull":false,
"defaultValue":"0",
"primaryKey":false
},
"updated_at":{
"type":"TIMESTAMP",
"allowNull":false,
"defaultValue":"CURRENT_TIMESTAMP",
"primaryKey":false
}
}
Столбец updated_at
определение в create.sql:
updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
Сгенерировано таким образоммодель полностью отсутствует ON UPDATE CURRENT_TIMESTAMP
.
После того, как модели сгенерированы, я использую их для секвелизации v4 вместе с экспрессом.
К счастью, можно установить timestamps: false
в определении модели, ноэто не работает.Я также безуспешно пытался updated_at: false
(вместе с underscored: true
) (это не имело никакого эффекта - все та же ошибка).
Единственное, что сработало, это полное удаление ключа updated_at
из модели перед определением,После этого все работало как шарм, но мне нужно отфильтровать этот столбец, чтобы он не был решением.
model.js:
const SequelizeAuto = require("sequelize-auto");
const Sequelize = require("sequelize");
const config = require("../conf/config.json");
const Op = Sequelize.Op; // fixed sequelize v3 bug
var options = {
database: config.db.name,
username: config.db.username,
password: config.db.password,
host: config.db.host,
dialect: config.db.dialect,
operatorsAliases: Op,
pool: {
max: 5,
min: 0,
idle: 10000
},
directory: false, // prevents the program from writing to disk
//port: 'port',
//tables: [],
additional: {
underscored: true,
timestamps: false
}
};
const modelOptions = {
bb_campaign: {
alias: "campaign"
},
bb_campaign_stats: {
alias: "stat"
}
};
function getTableOptions(tableName) {
return {
freezeTableName: true,
underscored: true,
timestamps: false,
updated_at: false,
tableName: tableName
}
}
// SequelizeAuto uses old sequelize v3 + mysql (not mysql2)
var db_map = new SequelizeAuto(config.db.name, config.db.username, config.db.password, options);
module.exports = new Promise((resolve, reject) => db_map.run((err) => {
if (err) {
reject(err);
return;
}
// atm session is closed, we need to create new
// https://github.com/sequelize/sequelize-auto/issues/243
let db = {};
db.sequelize = new Sequelize(options);
for (tableName in db_map.tables) {
let alias = tableName in modelOptions ?
modelOptions[tableName].alias : tableName;
db[alias] = db.sequelize.define(alias, db_map.tables[tableName], getTableOptions(tableName));
console.log('Registered model for table %s as %s.', tableName, alias);
// asociace ted nepotrebujeme
//if (tableName in db_map.foreignKeys) {}
}
resolve(db);
}));
Вставка:
Executing (default): INSERT INTO `bb_campaign` (`id`,`name`,`start`,`end`, `active`,`updated_at`) VALUES ('216450','item name','2018-12-02','2018-12-08',1,'CURRENT_TIMESTAMP') ON DUPLICATE KEY UPDATE `id`=VALUES(`id`), `name`=VALUES(`name`), `start`=VALUES(`start`), `end`=VALUES(`end`), `active`=VALUES(`active`);
БДошибка:
Необработанный отказ SequelizeDatabaseError: Неверное значение даты и времени: 'CURRENT_TIMESTAMP' для столбца updated_at в строке 1
Есть предложения?