2017-01-31 3 views
1

Необходимо изменить тип данных и значение по умолчанию столбца в MySql Db с использованием knex; Позднего типа данных был дату и нужно изменить, что для DATETIME, а также значения по умолчанию необходимо изменить с NULL к CURRENT_TIMESTAMPMy Sql Alter Table с использованием knex.js

MySql запросов для достижения соответствующего приводятся ниже

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

Я создал файл knex миграции для запуска вышеуказанных изменений:

Con палатка файла миграции приведена ниже:

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 добавить added_date DATETIME по умолчанию CURRENT_TIMESTAMP - ER_DUP_FIELDNAME: Дублирование имя столбца 'added_date' ошибки в переносе последней версии Ошибка: ER_DUP_FIELDNAME: Дублирование имя столбца «added_date '

Может ли кто-нибудь передать точный метод/синтаксис ALTER таблице с указанными выше изменениями?

+0

, пожалуйста, добавьте эту ошибку для справки. – davejal

ответ

4

В настоящее время (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'); 
}; 

EDIT: Я начал отделочные этот запрос тянуть и в следующем 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();  
    }); 
}; 

Я добавлю это также чтобы убедиться, что они работают.