我需要为rails应用程序迁移一个PG数据库--我正在更新表的一个列的类型,从布尔到int。下面是代码:
类ChangeAdminToInt < ActiveRecord::Migration执行‘ALTER "users“ALTER列"admin”TYPE int使用("admin"::int)设置默认值"1“end
当我运行bundle exec rake db:migrate
时,会得到以下错误:
错误:错误:语法错误位于或接近" SET“第5行:设置默认值"1”
但是,当我将代码切换到:
类ChangeAdminToInt
我知道错误:
错误:错误:在或接近" TYPE“第5行的语法错误:输入int使用("admin"::int)
因为问题不在于函数,而在于第5行,所以我认为数据库只是不喜欢第5行。我尝试过许多类型的语法,单引号/双引号,%q/%Q块,甚至把整个引号放在一行,但是语法错误仍然指向类型和SET默认值的前面。问题不在于改变这里发生了什么?
任何帮助都是非常感谢的。如果我错过了明显的事情,请告诉我。顺便提一下一些Gemfile:
源'https://rubygems.org‘ruby '1.9.3’宝石'rails','~> 4.0.1.rc3‘创业板’引导-sass‘,'2.3.2.0’创业板‘bcrypt’,'~> 3.1.1‘宝石'faker','1.1.2’创业板‘将分页’,'3.0.4‘创业板’引导-将_分页‘,'0.0.9’宝石'safe_attributes‘组:开发:测试做创业板'pg','0.15.1‘创业板'sqlite3’创业板‘rspec’,'2.13.1‘创业板’保护-rspec‘,'2.5.0’创业板‘s猪肉-rails’,github:‘孢krb/sporkrb’宝石‘保护-rspec’,'1.5.0‘宝石’子过程‘,'0.3.6’结束。
以及开发环境的database.yml:
开发:适配器: postgresql编码: utf8数据库: project_development池:5用户名: postgres
发布于 2013-10-25 17:37:35
我想出来了!
这句话来自PostgreSQL网站http://www.postgresql.org/docs/8.1/static/sql-altertable.html
由于这种灵活性,使用表达式不应用于列的默认值(如果有的话);结果可能不是默认值所需的常量表达式。这意味着,当没有隐式或赋值从旧类型转换到新类型时,ALTER可能无法转换默认类型,即使提供了USING子句。在这种情况下,删除DEFAULT with,执行ALTER类型,然后使用SET default添加合适的新默认值。类似的考虑也适用于涉及该列的索引和约束。
如果我首先尝试更改类型,它就不喜欢旧的默认设置。如果我第一次设置一个新的默认设置,它不知道如何键入转换。本文指出,执行特定操作的正确方法是首先删除默认值,更改类型,然后设置新的默认值。
这是对我有用的密码。
类ChangeAdminToInt < ActiveRecord::Migration -执行%q( ALTER用户更改列admin DEFAULT,ALTER列admin类型int使用(" admin "::int),ALTER列管理集默认1;)
仅此而已!
发布于 2013-10-25 08:47:35
我不认为你的使用条款是正确的。这来自postgre (http://www.postgresql.org/docs/8.0/static/sql-altertable.html):
可选USING子句指定如何从旧列计算新列值;如果省略,默认转换与从旧数据类型转换为new的赋值相同。如果没有从旧类型到新类型的隐式或赋值转换,则必须提供USING子句。
所以使用它来告诉postgres如何计算新的值类型和旧的值类型。我真的不明白USING ("admin"::int)
在查询中意味着什么。尝试省略使用子句或尝试如下所示:
USING CASE WHEN "admin" = TRUE THEN 1 ELSE 0 END
https://stackoverflow.com/questions/19584284
复制相似问题