4

For some reason my db:seed is not working when I try to do it via heroku. It works fine when I do it locally.

paul@paul-laptop:~/rails_projects/foglift$ heroku rake db:seed
rake aborted!
PGError: ERROR:  null value in column "id" violates not-null constraint
: INSERT INTO "metric_records" ("metric_id", "id", "created_at", "updated_at", "value", "school_id", "date") VALUES (1, NULL, '2011-03-18 20:26:39.792164', '2011-03-18 20:26:39.792164', 463866000.0, 1, '2009-01-01') RETURNING "id"

(See full trace by running task with --trace)
(in /app/5aca24ae-c5a7-4805-a3a1-b2632a5cf558/home)

I'm not sure why it's attempting to put a null into the id column, it doesn't make any sense to me.

Here's my seeds.rb file.

# This file should contain all the record creation needed to seed the database with its default values.
# The data can then be loaded with the rake db:seed (or created alongside the db with db:setup).


  directory = "db/seed_data/"

# Pre-load All Schools
  School.delete_all
  path = File.join(directory, "schools.txt")
  open(path) do |schools|
    schools.read.each_line do |school|
      name, city, state, website, tuition, debt = school.chomp.split("|")
      School.create!(:name => name, :city => city, :state => state, :website => website, :current_tuition => tuition, :current_avg_debt => debt)
    end
  end

# Pre-load All Dashboards
  Dashboard.delete_all
  path = File.join(directory, "dashboards.txt")
  open(path) do |dashboards|
    dashboards.read.each_line do |dashboard|
     name, extra = dashboard.chomp.split("|")
     Dashboard.create!(:name => name)
    end
  end

# Pre-load All Metrics
  Metric.delete_all
  path = File.join(directory, "metrics.txt")
  open(path) do |metrics|
    metrics.read.each_line do |metric|
     name, dashboard_id, display, source = metric.chomp.split("|")
     Metric.create!(:name => name, :dashboard_id => dashboard_id, :display => display, :source => source)
    end
  end

# Pre-load All Metric Records
  MetricRecord.delete_all
  path = File.join(directory, "metric_records.txt")
  open(path) do |values|
    values.read.each_line do |value|
      metric_id, value, date_string, school_id = value.chomp.split("|")
      date_string = '01/01/' << date_string
      date = Date.strptime(date_string, "%d/%m/%Y") unless date_string.nil?
      MetricRecord.create!(:metric_id => metric_id, :value => value, :date => date, :school_id => school_id)
    end
  end
Joe Doyle
  • 6,363
  • 3
  • 42
  • 45
Paul Pettengill
  • 4,843
  • 1
  • 29
  • 33

1 Answers1

2

Is there a possibility that your DB migration did not create a sequence for your metric_records ID column on the Heroku database?

You might be able to fix it with the following:

CREATE SEQUENCE metric_records_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;

ALTER SEQUENCE metric_records_id_seq OWNED BY metric_records.id;
Scott
  • 17,127
  • 5
  • 53
  • 64
  • I thought table id was a column that Rails handled all by itself. It's working for my other tables, without an explicit declaration of sequence. Anyway, I tried implementing your solution in my initial create metric_records table, and received the following error: 'code'rake aborted! An error has occurred, this and all later migrations canceled: undefined method `metric_records_id_seq' for # – Paul Pettengill Mar 24 '11 at 01:05
  • You're right: Rails does handle ID columns transparently. I was theorising that for some reason the definition for that table on Heroku had ended up with an integer ID instead of a serial type. My answer was suggested as a fix for that issue on the Postgres database in Heroku, but not your local dev database (SQLite won't know what those commands do). It was a long shot, I'll admit. – Scott Mar 24 '11 at 10:43
  • Thanks, I appreciate the help. I think I'm going to go with a different design that doesn't have this table, hoping that I don't incur the error with another table. – Paul Pettengill Mar 25 '11 at 08:19