我的 Sql 使用 knex.js 改变 Table
My Sql Alter Table using knex.js
需要使用 knex 更改 MySql Db 中列的数据类型和默认值;
后来数据类型是 date 并且需要将其更改为 dateTime 并且默认值需要从 NULL 到 CURRENT_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();
});
};
我会将这些也添加到集成测试中以确保它们有效。
需要使用 knex 更改 MySql Db 中列的数据类型和默认值; 后来数据类型是 date 并且需要将其更改为 dateTime 并且默认值需要从 NULL 到 CURRENT_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();
});
};
我会将这些也添加到集成测试中以确保它们有效。