问题是我无法将列类型更改为“文本”
这是我看到的错误:
DarkBook:playground Justin $ rake migrate_up(在/ Users / Justin / Dropbox / Business / datamapper / playground中)〜开始迁移==执行迁移#1:create_person_table CREATE TABLE people
(id
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一直是地狱般的。
答案 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
我将更新文档以包含此内容。