在插入新行'PG :: NotNullViolation:ERROR:列“id”中的空值时出现Postgresql错误违反了非空约束'

时间:2016-10-19 04:48:35

标签: ruby-on-rails postgresql heroku

我只是将我的服务器迁移到heroku上的eu区域,并restore将旧database backup迁移到新服务器。不幸的是,当我尝试error到表格

时,我正在关注insert an new row
INSERT INTO "users" ("created_at", "id", ...) VALUES ($1, $2, ...) [["created_at", Thu, 13 Oct 2016 23:53:17 CEST +02:00], ["id", nil], ...]

ActiveRecord::StatementInvalid: PG::NotNullViolation: ERROR: null value in column "id" violates not-null constraint

DETAIL: Failing row contains (null, ...)

我的架构如下所示

create_table "users", :id => false, :force => true do |t|
   t.integer  "id",          :null => false  
   t.datetime "created_at",  :null => false
   ...
end

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

我尝试过以下解决方案来解决这个问题,我正在写下那些需要它的人。

解决方案#1

删除我的本地数据库

rake db:drop

运行迁移

rake db:migrate

现在使用--data-only选项

导入生产数据库
pg_restore --data-only --verbose --no-acl --no-owner -h localhost -U user_name -d database_name latest.dump

它部分解决了我的问题,但表格中为lose all my data,所以this is not an suitable one

解决方案#2(正常工作)

在观察到错误之后,我理解了一些事情,比如主键序列是中断,并且系统不应该尝试将空值插入ID字段以及一些我的model forgot the primary key。然后我set the primary key通过模型及其working fine

class User < ActiveRecord::Base
  self.primary_key = 'id'
end

答案 1 :(得分:0)

我遇到了一个奇怪的问题,但通过第一个解决方案的一个细微变化解决了该问题:

foreach ($xml->Article as $Article)

然后

rake db:drop

最后

rake db:migrate:reset

通过这种方式,它可以保持数据库结构,仅还原数据,但是,通过不检查外键约束,可以加载表,并且不会以一堆空表结尾...