Heroku ActiveRecord Ошибка: PgSQL пустое значение в поле id - PullRequest
2 голосов
/ 28 сентября 2011

Я только что развернул простое приложение Ruby on Rails (3.0.10) в Heroku.Есть строка кода, создающая новый объект User, подобный этому.

User.create(:name => "[name here]", :email => "[email here]")

Он может хорошо работать на моей локальной машине, которая использует MySQL.После того, как я развернул его в Heroku, я получил ошибку.

ActiveRecord::StatementInvalid: PGError: ERROR:  null value in column "id" violates not-null constraint : INSERT INTO "users" ("id", "name", "email", "created_at", "updated_at") VALUES (NULL, '[name here]', '[email here]', '2011-09-28 03:59:12.908593', '2011-09-28 03:59:12.908593') RETURNING "id"

Я понятия не имею, что не так с моим кодом.Я что-то пропустил?

Спасибо всем.

ОБНОВЛЕНИЕ

Миграция

class CreateUsers < ActiveRecord::Migration
  def self.up
    create_table :users do |t|
      t.string :email
      t.string :name

      t.timestamps
    end
  end

  def self.down
    drop_table :users
  end
end

Схема

ActiveRecord::Schema.define(:version => 20110922071106) do

  create_table "users", :force => true do |t|
    t.string   "email"
    t.string   "name"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

end

Ответы [ 4 ]

2 голосов
/ 23 октября 2011

Для всех, кто ищет, у меня была такая же проблема.Отлично работал в dev, но не работал на Postgres.Проблема, с которой я столкнулся, я отследил до плагина CanCan, в частности кода, который у меня был, который создавал гостевой пользователь файлancy.rb, если пользовательский объект не существовал.Гостевой аккаунт был предложен в Railscast.Я удалил команду создания гостя User.new, и проблема решена.

2 голосов
/ 28 сентября 2011

Ты сделал это: (Взято из http://railsapps.github.com/rails-heroku-tutorial.html)

Замените SQLite на PostgreSQL. Если вы разрабатываете локально, используя SQLite, вам нужно будет переключиться на PostgreSQL для развертывания в Heroku. Если вы не хотите разрабатывать с использованием PostgreSQL локально, вы можете настроить ваш Gemfile для использования SQLite для разработки и PostgreSQL для производства.

Чтобы перейти с SQLite на PostgreSQL для развертывания в Heroku, отредактируйте ваш Gemfile и измените эту строку:

gem 'sqlite3'

К этому:

group :production do
  gem 'pg' 
end 
group :development, :test do
  gem 'sqlite3'
end
1 голос
/ 12 февраля 2014

У меня была похожая проблема. если вы попытаетесь перезагрузить схему (в локальной системе, очевидно, не производите ее в рабочей среде), вы должны увидеть разницу в том, что, по вашему мнению, у вас есть, и в том, что на самом деле думает база данных.

rake db:schema:dump
rake db:schema:load

ЭТО СТАНЕТ ВАШИМИ ДАННЫМИ. Но вы должны увидеть разницу в схеме для «пользователей». Это была моя разница:

Свежий отвал показал:

create_table "posts", :id => :false, :force => true do |t|
    t.integer "id", :null  => false, :limit=> 8
    t.integer  "object_id",    :limit => 8
    t.string   "post_type"
    t.string   "from_id"
    t.text     "picture_url"
    t.text     "video_source"
    t.integer  "shares"
    t.integer  "likes"
    t.datetime "created_at",                :null => false
    t.datetime "updated_at",                :null => false
    t.integer  "image_size",   :limit => 8
    t.integer  "vid_size",     :limit => 8
end

Но я знаю, что id обрабатывается рельсами, и это должно быть:

create_table "posts", :force => true do |t|
    t.integer  "object_id",    :limit => 8
    t.string   "post_type"
    t.string   "from_id"
    t.text     "picture_url"
    t.text     "video_source"
    t.integer  "shares"
    t.integer  "likes"
    t.datetime "created_at",                :null => false
    t.datetime "updated_at",                :null => false
    t.integer  "image_size",   :limit => 8
    t.integer  "vid_size",     :limit => 8
end

Если это также относится к вам, просто добавьте к вашей модели пользователя:

set_primary_key :id

Это сбросило его и теперь оно работает. Я до сих пор не знаю причину проблемы, но это исправило ее для меня.

1 голос
/ 28 сентября 2011

Я просто воссоздаю все приложение RoR и копирую все контроллеры, модели и представления, которые я построил, в новое приложение.Теперь он работает хорошо.

Я пытался сравнить 2 версии, но ничего не получилось.Дайте знать, ребята, если я выясню причину этого.

Спасибо всем.:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...