DataMapper将列迁移到新数据类型

时间:2011-02-10 02:00:52

标签: mysql ruby datamapper

问题是我无法将列类型更改为“文本”

这是我看到的错误:

DarkBook:playground Justin $ rake migrate_up(在/ Users / Justin / Dropbox / Business / datamapper / playground中)〜开始迁移==执行迁移#1:create_person_table CREATE TABLE peopleid SERIAL PRIMARY KEY,name VARCHAR(2),age INTEGER)ENGINE = InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci - > 0.0112s - > 0.0129s ==执行迁移#2:change_name_constraints rake aborted! '未初始化的常量SQL :: TableModifier :: Text /Users/Justin/Dropbox/Business/datamapper/playground/rakefile.rb:61:在'块(3级)中'(通过使用--trace运行任务查看完整跟踪) 我用来测试DataMapper的Rake脚本:https://gist.github.com/818143 似乎好像TableModifier类中的change_column方法没有正确地将列更改语句转换为MySQL。其他看似相关的错误是,如果我尝试将列转换为更长的字符串,我得到这个: DarkBook:游乐场Justin $ rake migrate_up(在/ Users / Justin / Dropbox / Business / datamapper / playground中)〜开始迁移==执行迁移#2:change_name_constraints

ALTER TABLE people ALTER COLUMN name TYPE String

〜您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在第1行的“TYPE字符串”附近使用正确的语法(代码:1064,sql状态:42000,查询:ALTER TABLE people ALTER COLUMN name TYPE String,uri:mysql:// root:@ 127.0.0.1datamapper_test)rake aborted!您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在第1行的“TYPE String”附近使用正确的语法

/Users/Justin/Dropbox/Business/datamapper/playground/rakefile.rb:60:in`block(2 levels)in'(通过使用--trace运行任务查看完整跟踪)

根据我读过的关于MySQL的内容,“ALTER TABLE people ALTER COLUMN name TYPE String”不是有效的MySQL查询命令。 TYPE不应该存在,String应该转换为VARCHAR。

查看change_column方法,我看到它只是我提供的类型的直接传递。这让我想到也许我不应该直接调用change_column方法?

一旦我理解了这一点并且我很顺利,我正在记录这些东西,因为搞清楚DataMapper的迁移api一直是地狱般的。

2 个答案:

答案 0 :(得分:1)

这是我找到的一项工作: https://gist.github.com/819792

答案 1 :(得分:1)

change_column不是特别明亮。目前的实施是:

def change_column(name, type, opts = {})
  @statements << "ALTER TABLE #{quoted_table_name} ALTER COLUMN #{quote_column_name(name)} TYPE #{type}"
end

这意味着您需要指定底层的sql类型而不是DataMapper类型。即:

modify_table :people do
  change_column :name, 'text'
end

我将更新文档以包含此内容。