簡體   English   中英

為什么我在使用Postgresql的rails應用程序中使用布爾字段時收到ActiveRecord :: StatementInvalid:PG :: SyntaxError:ERROR?

[英]Why am I receiving an ActiveRecord::StatementInvalid: PG::SyntaxError: ERROR when using a boolean field in a rails app with Postgresql?

我正在開發一個rails API並使用Heroku。 所有環境都使用Postgres。 我在rake db中遇到了同樣的錯誤:setup和rake db:test:prepare(以及'heroku run rake db:setup')。 當我第一次嘗試推送到Heroku時,這個問題最初出現了。 我在本地使用mysql。 因為已經將開發和測試遷移到postgres以避免將來出現類似的驚喜......

$ rake db:test:prepare
rake aborted!
ActiveRecord::StatementInvalid: PG::SyntaxError: ERROR:  syntax error at or near "("
LINE 1: ...r, "borrower_id" integer, "lenderAccepted" boolean(1), "crea...
                                                         ^
: CREATE TABLE "bookings" ("id" serial primary key, "pickup" timestamp, "hoursBooked" integer, "lender_id" integer, "borrower_id" integer, "lenderAccepted" boolean(1), "created_at" timestamp NOT NULL, "updated_at" timestamp NOT NULL, "equipment_id" integer)

這是遷移:

class CreateBookings < ActiveRecord::Migration
  def change
    create_table :bookings do |t|
      t.datetime :pickup
      t.integer :hoursBooked
      t.references :lender, index: true
      t.references :borrower, index: true
      t.boolean :lenderAccepted

      t.timestamps null: false
    end
    add_foreign_key :bookings, :lenders
    add_foreign_key :bookings, :borrowers
  end
end

這是我的寶石文件:

source 'https://rubygems.org'

gem 'rails', '4.2.0'
gem 'sass-rails', '5.0.0.beta1'
gem 'uglifier', '2.5.3'
gem 'coffee-rails', '4.1.0'
gem 'jquery-rails', '4.0.0.beta2'
gem 'turbolinks', '2.3.0'
gem 'jbuilder', '2.2.3'
gem 'devise', '3.4.1'
gem 'sdoc', '0.4.0', group: :doc
gem 'pg',   '0.17.1'

gem 'bcrypt-ruby', '3.1.1.rc1', :require => 'bcrypt'

group :development, :test do
  gem 'byebug', '3.4.0'
  gem 'web-console', '2.0.0.beta2'
  gem 'spring', '1.1.3'
end

group :production do
  gem 'rails_12factor', '0.0.2'
end

group :test do
  gem 'minitest-reporters', '1.0.5'
  gem 'mini_backtrace', '0.1.3'
  gem 'guard-minitest', '2.3.1'
end

使用:

  • ruby 2.1.4p265(2014-10-27修訂版48166)[x86_64-linux]
  • rails 4.2.0
  • Postgres 9.3.5

感謝您提供的任何幫助。

法案

PS,添加生成的架構:

create_table "bookings", force: :cascade do |t|
    t.datetime "pickup"
    t.integer  "hoursBooked",    limit: 4
    t.integer  "lender_id",      limit: 4
    t.integer  "borrower_id",    limit: 4
    t.boolean  "lenderAccepted", limit: 1
    t.datetime "created_at",               null: false
    t.datetime "updated_at",               null: false
    t.integer  "equipment_id",   limit: 4
end

add_index "bookings", ["borrower_id"], name: "index_bookings_on_borrower_id", using: :btree
add_index "bookings", ["equipment_id"], name: "index_bookings_on_equipment_id", using: :btree
add_index "bookings", ["lender_id"], name: "index_bookings_on_lender_id", using: :btree

由於AR + mysql偽造布爾字段的方式,這是Rails中的一個錯誤。 我為此做了一個補丁:) https://github.com/rails/rails/issues/19065

勝利是mu太短了! 感謝您的深刻見解!

似乎問題是我使用mysql時運行的原始db:migration對postgres來說是不可接受的。 從遷移和模式中注釋掉字段,然后在新的遷移下將它們添加回來修復了所有...

class AddBackBooleansMigration < ActiveRecord::Migration
  def change
      add_column :bookings, :lender_accepted, :boolean
      # other similar boolean adds
  end
end

新架構:

  create_table "bookings", force: :cascade do |t|
    ...
    t.boolean  "lender_accepted"
  end

耙它直到你成功。

$ rake db:migrate
== 20150105131615 AddBackBooleansMigration: migrating =========================
-- add_column(:bookings, :lender_accepted, :boolean)
   -> 0.0333s
...
== 20150105131615 AddBackBooleansMigration: migrated (0.0370s) ================

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM