推送到Heroku时Rails迁移错误w / Postgres
我正在尝试执行以下向上迁移以更改“tweet”模型表中的“number”列
class ChangeDataTypeForTweetsNumber < ActiveRecord::Migration def up change_column :tweets do |t| t.change :number, :integer end end def down change_table :tweets do |t| t.change :number, :string end end end
执行以下向上迁移到heroku ….
heroku rake db:migrate:up VERSION=20120925211232
我收到以下错误
PG::Error: ERROR: column "number" cannot be cast to type integer : ALTER TABLE "tweets" ALTER COLUMN "number" TYPE integer
任何想法都会非常感激。
感谢大家。
从精细手册 :
[ALTER TABLE … ALTER COLUMN …]
可选的USING
子句指定如何从旧的计算新列值; 如果省略,则默认转换与从旧数据类型转换为new的赋值相同。 如果没有从旧类型到新类型的隐式或赋值转换,则必须提供USING
子句。
在PostgreSQL中没有从varchar
到int
隐式转换,所以它抱怨column "number" cannot be cast to type integer
而ALTER TABLE失败。 您需要告诉PostgreSQL如何将旧字符串转换为数字以匹配新列类型,这意味着您需要在ALTER TABLE中获取USING子句。 我不知道有什么方法可以让Rails为你做到这一点,但你可以轻松地手工完成:
def up connection.execute(%q{ alter table tweets alter column number type integer using cast(number as integer) }) end
您需要注意无法转换为整数的值,PostgreSQL会告诉您是否存在问题,并且您必须在迁移成功之前修复它们。
您现有的向下迁移应该没问题,应该自动处理将integer
转换为varchar
。
与上面相同,但更简洁一点:
change_column :yourtable, :column_to_change, 'integer USING CAST("column_to_change" AS integer)'
- 如何从SQLite迁移到PostgreSQL(Rails)
- ActionView :: Template :: Error(在heroku上没有将Fixnum隐式转换为String
- 在Heroku,Cedar,与Unicorn:获取ActiveRecord :: StatementInvalid:PGError:SSL SYSCALL错误:检测到EOF
- 使用AWS RDS在Heroku App上获取Mysql2 :: Error(SSL连接错误:ASN:错误的其他签名确认)
- ActiveRecord :: StatementInvalid:PG ::错误:错误:无法在Heroku中的只读事务错误中执行UPDATE
- heroku运行rake db:迁移错误
- Heroku / Unicorn上的重复导轨错误 – “执行过期”,一个ActionView :: Template :: Error
- DB上的错误:迁移“未初始化的常量DeviseCreateUsers”
- Heroku删除我上传的文件,为什么?