2014-12-12 5 views
3

У меня есть сценарий, который использует Class :: DBIx :: Schema-> deploy для создания базы данных для приложения, которое я создаю.DBIx :: Class :: Schema :: Loader, определяющий CURRENT_TIMESTAMP как строку, а не ссылку на строку

Я использую MySQL 5.6.19

Некоторые из таблиц имеют даты-поля, которые имеют значение по умолчанию CURRENT_TIMESTAMP (который действителен для MySQL версий> 5.6)

Когда я запускаю код для заполнить базу данных, развертывание ставит кавычки CURRENT_TIMESTAMP следующим образом:

CREATE TABLE `company_info` (
    `id` bigint unsigned NOT NULL auto_increment, 
    `ugroup` bigint unsigned NULL, 
    `created` datetime NULL DEFAULT 'CURRENT_TIMESTAMP', 
    `num_employees` integer NOT NULL DEFAULT 1, 
    `type` char(16) NULL, 
    INDEX `company_info_idx_ugroup` (`ugroup`), 
    PRIMARY KEY (`id`), 
    CONSTRAINT `company_info_fk_ugroup` FOREIGN KEY (`ugroup`) REFERENCES `groups` (`id`) ON DELETE SET NULL ON UPDATE CASCADE 
) ENGINE=InnoDB 

кавычек вызовет ошибку «недопустимое значение по умолчанию для" создан», удалив кавычки и выполнив команду из командной строки работает нормально, если котировки ft на месте, он терпит неудачу.

Это происходит потому, что в схеме :: Result, у нас есть строка "CURRENT_TIMESTAMP", а затем строку ссылочный \ "CURRENT_TIMESTAMP"

Schema :: Result :: CompanyInfo выглядит следующим образом и генерируется;

use utf8; 
package Schema::Result::CompanyInfo; 

# Created by DBIx::Class::Schema::Loader 
# DO NOT MODIFY THE FIRST PART OF THIS FILE 

use strict; 
use warnings; 

use base 'DBIx::Class::Core'; 
__PACKAGE__->load_components("InflateColumn::DateTime"); 
__PACKAGE__->table("company_info"); 
__PACKAGE__->add_columns(
    "id", 
    { 
    data_type => "bigint", 
    extra => { unsigned => 1 }, 
    is_auto_increment => 1, 
    is_nullable => 0, 
    }, 
    "ugroup", 
    { 
    data_type => "bigint", 
    extra => { unsigned => 1 }, 
    is_foreign_key => 1, 
    is_nullable => 1, 
    }, 
    "created", 
    { 
    data_type => "datetime", 
    datetime_undef_if_invalid => 1, 
    default_value => "CURRENT_TIMESTAMP", 
    is_nullable => 1, 
    }, 
    "num_employees", 
    { data_type => "integer", default_value => 1, is_nullable => 0 }, 
    "type", 
    { data_type => "char", is_nullable => 1, size => 16 }, 
); 
__PACKAGE__->set_primary_key("id"); 
__PACKAGE__->belongs_to(
    "ugroup", 
    "Schema::Result::Group", 
    { id => "ugroup" }, 
    { 
    is_deferrable => 1, 
    join_type  => "LEFT", 
    on_delete  => "SET NULL", 
    on_update  => "CASCADE", 
    }, 
); 


# Created by DBIx::Class::Schema::Loader v0.07042 @ 2014-11-24 14:30:12 
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:Q6PHwuB2Zk74lVC08u8CMQ 


# You can replace this text with custom code or comments, and it will be preserved on regeneration 
1; 

Изменение default_value => "CURRENT_TIMESTAMP", в default_value => \ "CURRENT_TIMESTAMP", исправляет эту проблему, однако, так как это генерируется DBIx :: Class :: Schema :: Loader Я предпочел бы не вручную отредактируйте все связанные файлы.

Это ошибка или есть способ сообщить DBIx :: Class :: Schema :: Loader, чтобы создать ссылку на строку вокруг CURRENT_TIMESTAMP?

Благодаря

ответ

3

Я считаю, что аргумент DEFAULT_VALUE должна быть ссылка строка:

default_value => \"CURRENT_TIMESTAMP", 
+0

Да, что работает - спасибо, за исключением того, что файл схемы генерируется DBIx :: Class :: Schema :: Loader, так что вы знаете, если есть способ получить DBIx :: Class :: Schema: : Loader для правильного создания файла? Я уточню вопрос. – mark

1

Существует условие в C: \ Perl \ сайт \ Lib \ DBIx \ Class \ Схемы \ Loader \ DBI \ mysql.pm (l. 305), который заменяет строку ссылкой. По какой-то причине это относится только к «метке времени», но вы можете внести изменения и в «datetime».

if ((not blessed $dbi_info) # isa $sth 
    && lc($dbi_info->{COLUMN_DEF})  eq 'current_timestamp' 
    && lc($dbi_info->{mysql_type_name}) eq 'timestamp') { 

    my $current_timestamp = 'current_timestamp'; 
    $extra_info{default_value} = \$current_timestamp; 
} 
+1

«Причина» в том, что CURRENT_TIMESTAMP для DATETIME поддерживается из MySQL 5.6.5 http://stackoverflow.com/questions/168736/how-do-you-set-a-default-value-for-a-mysql -datetime колонки/10603198 # 10603198 – ojinmor