我需要为 Rails 应用程序迁移 PG 数据库 - 我正在将表的一列的类型从布尔值更新为 int。这是代码:
class ChangeAdminToInt < ActiveRecord::Migration def up execute ' ALTER TABLE "users" ALTER COLUMN "admin" TYPE int USING ("admin"::int) SET DEFAULT "1" ' end end
当我运行时,bundle exec rake db:migrate
我收到错误:
PG::Error: ERROR: syntax error at or near "SET" LINE 5: SET DEFAULT "1"
但是,当我将代码切换到:
class ChangeAdminToInt < ActiveRecord::Migration def up execute ' ALTER TABLE users ALTER COLUMN admin TYPE int USING (admin::int); SET DEFAULT 1 ' end end
我得到错误:
PG::Error: ERROR: syntax error at or near "TYPE" LINE 5: TYPE int USING ("admin"::int)
因为问题不在于函数,而在于第 5 行,所以我认为数据库不喜欢第 5 行。PG 仅解析我的部分执行命令的引用长度是否有限制?我尝试了许多类型的语法,单引号/双引号,%q/%Q 块,甚至将整个引号放在一行中,但语法错误仍然指向 TYPE 和 SET DEFAULT 中的较早者。当然问题不在于 ALTER 这里发生了什么?
任何帮助表示赞赏。如果我错过了一些完全明显的东西,请告诉我。顺便说一句,一些 Gemfile:
source 'https://rubygems.org' ruby '1.9.3' gem 'rails', '~> 4.0.1.rc3' gem 'bootstrap-sass', '2.3.2.0' gem 'bcrypt-ruby', '~> 3.1.1' gem 'faker', '1.1.2' gem 'will_paginate', '3.0.4' gem 'bootstrap-will_paginate', '0.0.9' gem 'safe_attributes' group :development, :test do gem 'pg', '0.15.1' gem 'sqlite3' gem 'rspec-rails', '2.13.1' gem 'guard-rspec', '2.5.0' gem 'spork-rails', github: 'sporkrb/spork-rails' gem 'guard-spork', '1.5.0' gem 'childprocess', '0.3.6' end
以及用于开发环境的 database.yml:
development: adapter: postgresql encoding: utf8 database: project_development pool: 5 username: postgres