从Heroku转储,下载并pg_rested一个数据库后,每次尝试登录Rails应用程序时,都会出现上述错误。
以某种方式似乎用户ID被视为nil(即使我可以在数据库中看到一个id值)。
我还读到它可能是由于id是一个简单的int而不是一个序列号,但是,正如您在我的模式中看到的那样:
create_table "users", id: :serial, force: :cascade do |t|
t.string "email", default: "", null: false
t.string "encrypted_password", default: "", null: false
t.string "reset_password_token"
t.datetime "reset_password_sent_at"
t.datetime "remember_created_at"
t.integer "sign_in_count", default: 0, null: false
t.datetime "current_sign_in_at"
t.datetime "last_sign_in_at"
t.string "current_sign_in_ip"
t.string "last_sign_in_ip"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "name"
t.string "last_name"
t.string "provider"
t.string "uid"
t.boolean "admin", default: false, null: false
t.boolean "affiliate_approved", default: false, null: false
t.integer "cart_id"
t.float "rev_share"
t.boolean "notice", default: false, null: false
t.string "iban"
t.string "piva"
t.string "invitation_token"
t.datetime "invitation_created_at"
t.datetime "invitation_sent_at"
t.datetime "invitation_accepted_at"
t.integer "invitation_limit"
t.string "invited_by_type"
t.integer "invited_by_id"
t.integer "invitations_count", default: 0
t.string "username"
t.string "slug"
t.integer "enrolls_count", default: 0
t.integer "partner_id"
t.string "country"
t.integer "referrer"
t.boolean "gdpr_marketing"
t.boolean "privacy_policy"
t.boolean "subscription", default: false
t.date "account_created_at"
t.boolean "profilazione"
t.boolean "terms_and_conditions"
t.index ["email"], name: "index_users_on_email", unique: true
t.index ["invitation_token"], name: "index_users_on_invitation_token", unique: true
t.index ["invitations_count"], name: "index_users_on_invitations_count"
t.index ["invited_by_id"], name: "index_users_on_invited_by_id"
t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
t.index ["username"], name: "index_users_on_username", unique: true
end
似乎该ID已被用作序列号。
您对可能出什么问题有任何想法吗?该应用程序正在生产中,有成千上万个不受此问题影响的用户,这使我认为本地PG设置有问题。
编辑-完整的错误消息
PG::NotNullViolation at /auth/google_oauth2/callback
ERROR: null value in column "id" violates not-null constraint
DETAIL: Failing row contains (null, 9367, 127.0.0.1, 2018-09-17 09:51:59.463125, 2018-09-17 09:51:59.463125).
编辑-更多发现
在user.rb(模型文件)中,有一个after_update钩子,用于执行以下操作:
def change_log
UserChange.create(ip_request: current_sign_in_ip, user: self)
end
这是为了使我们能够跟踪用户更改的所有内容及其IP(GDPR原因)。
注释掉之后,一切正常,我的用户按计划登录
答案 0 :(得分:0)
必须存在另一个试图以空ID持久化的表的回调。检查所有相关表的回调和架构。在您的情况下,这是UserChange表。
答案 1 :(得分:0)
从Heroku中提取数据库副本后,我也遇到了相同的错误:
PG::NotNullViolation: ERROR: null value in column "id" violates not-null constraint DETAIL: Failing row contains ...etc
每次我尝试创建新记录时都在发生。我猜想当您登录时,您的应用正在某处创建新记录(可能正在执行一些登录跟踪/记录?),从而触发了错误。如果您无法通过Web浏览器访问该应用程序,则可以尝试打开Rails控制台,看看如果尝试直接创建新记录会发生什么。如果仍然出现错误,则问题实际上出在登录名而不是数据库。
对我来说,问题是我在开发机上使用的是与创建转储文件的Heroku版本不同的Postgres版本。切换到匹配版本的Postgres,然后重新拉动数据库后,一切又恢复了预期。
如果在Mac上使用Postgres,则在添加新的Postgres服务器时,可以选择应使用哪个版本的Postgres。您希望使开发和生产环境尽可能相似,因此,您绝对希望确保数据库版本匹配。