【问题标题】:Heroku ActiveRecord Error: PgSQL put null in id fieldHeroku ActiveRecord 错误:PgSQL 在 id 字段中输入 null
【发布时间】:2011-11-26 13:13:38
【问题描述】:

我刚刚将一个简单的 Ruby on Rails (3.0.10) 应用程序部署到 Heroku。有一行代码像这样创建一个新的用户对象。

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

【问题讨论】:

  • 是的。我知道,但恐怕没有任何生产配置。太奇怪了……我正在做更深入的检查……会尽快在这里更新……

标签: ruby-on-rails ruby-on-rails-3 postgresql activerecord heroku


【解决方案1】:

您是否这样做过: (取自http://railsapps.github.com/rails-heroku-tutorial.html)

用 PostgreSQL 替换 SQLite 如果你在本地开发使用 SQLite,您需要切换到 PostgreSQL 进行部署 赫罗库。如果你不想在本地使用 PostgreSQL 开发,你 可以设置您的 Gemfile 以使用 SQLite 进行开发和 PostgreSQL 用于生产。

要从 SQLite 切换到 PostgreSQL 以部署到 Heroku,请编辑 您的 Gemfile 并更改此行:

gem 'sqlite3'

到这里:

group :production do
  gem 'pg' 
end 
group :development, :test do
  gem 'sqlite3'
end

【讨论】:

  • 谢谢哥们。我的 Gemfile 与您的建议相同。问题依然存在。
【解决方案2】:

我只是重新创建整个 RoR 应用程序,并将我构建的所有控制器、模型和视图复制到新应用程序中。现在运行良好。

我尝试比较 2 个版本,但没有任何结果。如果我找出原因会告诉你们的。

谢谢大家。 :)

【讨论】:

    【解决方案3】:

    对于其他人来说,我遇到了同样的问题。在开发中工作得很好,但在 Postgres 的生产中失败了。我追踪到 CanCan 插件的问题,特别是我的代码,如果不存在用户对象,则创建来宾用户的能力.rb 文件。来宾帐户是在 Railscast 中建议的。我删除了 User.new 来宾创建命令并解决了问题。

    【讨论】:

      【解决方案4】:

      我遇到了类似的问题。如果您尝试重新加载架构(在本地,显然不要在生产中执行),您应该会看到您认为自己拥有的内容与数据库实际认为的内容有所不同。

      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 由 rails 处理,这应该是:

      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
      

      重置它,它现在可以工作了。我仍然不知道问题的原因,但这为我解决了问题。

      【讨论】:

      • 谢谢@amankapur91。你的意思是set_primary_key :id这行需要永远保存在模型文件中吗?
      • @victorlamhk 是的,我知道这并不理想,但这是 heroku postrgress 的一个非常随机的错误。如果您切换到 aws,并使用 MYSQL,则不会发生。
      猜你喜欢
      • 1970-01-01
      • 2013-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-01
      • 2013-07-02
      • 1970-01-01
      相关资源
      最近更新 更多