我的 Sql 使用 knex.js 改变 Table

My Sql Alter Table using knex.js

需要使用 knex 更改 MySql Db 中列的数据类型和默认值; 后来数据类型是 date 并且需要将其更改为 dateTime 并且默认值需要从 NULLCURRENT_TIMESTAMP

MySql下面给出对应的查询实现

ALTER TABLE `Employees` 
CHANGE COLUMN `added_date` `added_date` DATETIME DEFAULT CURRENT_TIMESTAMP ;

我已经创建了 knex 迁移文件以 运行 以上更改:

迁移文件内容如下:

exports.up = function(knex, Promise) {
return knex.schema.alterTable('Employee', function(t) {
       t.dateTime('added_date').defaultTo(knex.fn.now());       
});
} ;

exports.down = function(knex, Promise) {
  return knex.schema.alterTable('Employee', function(t) {
 t.date('added_date').nullable();       
});
 };

但这在构建时总是会引发错误。 这就像

Knex:警告 - 迁移失败并出现错误:alter table Employee add added_date datetime default CURRENT_TIMESTAMP - ER_DUP_FIELDNAME: Duplicate column name 'added_date' 迁移最新版本时出错 错误:ER_DUP_FIELDNAME:列名称重复 'added_date'

任何人都可以分享确切的 method/syntax 以更改 table 并进行上述更改吗?

目前(knex 0.12.6)没有 raw() 调用无法做到这一点。将来如果 https://github.com/tgriesser/knex/pull/1759 完成,将提供更复杂的列更改功能。

exports.up = function(knex, Promise) {
  return knex.schema.raw('ALTER TABLE `Employees` CHANGE COLUMN `added_date` `added_date` DATETIME DEFAULT CURRENT_TIMESTAMP');
};

exports.down = function(knex, Promise) {
  return knex.schema.raw('ALTER TABLE `Employees` CHANGE COLUMN `added_date` `added_date` DATE DEFAULT NULL');
};

编辑:我开始完成那个 pull request,在下一个 knex(0.12.7 或 0.13.0)版本中将能够做到:

exports.up = function(knex, Promise) {
  return knex.schema.alterTable('Employee', function(t) {
    t.dateTime('added_date').defaultTo(knex.fn.now()).alter();       
  });
};

exports.down = function(knex, Promise) {
  return knex.schema.alterTable('Employee', function(t) {
    t.date('added_date').nullable().alter();       
  });
};

我会将这些也添加到集成测试中以确保它们有效。