2017-11-15 2 views
1

Arbeiten an einem kleinen Ruby-Skript zum Erstellen und Speichern von Daten in einer Postgres-Datenbank. Die App funktioniert problemlos, wenn es um das Erstellen und Löschen der Datenbank oder das Ausführen von Migrationen geht. Es schlägt jedoch fehl, wenn ich versuche, rake db:seed auszuführen. Die Fehlermeldung zeigt an, dass die Tabelle nicht existiert ... aber in der Zwischenzeit, wenn ich das gleiche SQL-Skript in der Fehlermeldung referenziert, aber in pgAdmin, gibt es gültige Ergebnisse zurück. Ich frage mich, ob etwas mit den Privilegien geschieht, die dem Benutzer gewährt werden, der in der database.yml genannt wird, und wenn ja, wie würde ich das im Skript adressieren? Jede Hilfe, die dies versteht, wäre willkommen. HierRuby/Postgres ActiveRecord ohne Rails: Undefinierte Tabelle FEHLER: Relation "..." existiert nicht

ist die Fehlermeldung ich im Terminal bekommen:

acmecorp$ rake db:seed 
rake aborted! 
ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR: relation "applications" does not exist 
LINE 8:    WHERE a.attrelid = '"applications"'::regclass 
             ^
:    SELECT a.attname, format_type(a.atttypid, a.atttypmod), 
        pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod, 
        c.collname, col_description(a.attrelid, a.attnum) AS comment 
       FROM pg_attribute a 
       LEFT JOIN pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum 
       LEFT JOIN pg_type t ON a.atttypid = t.oid 
       LEFT JOIN pg_collation c ON a.attcollation = c.oid AND a.attcollation <> t.typcollation 
       WHERE a.attrelid = '"applications"'::regclass 
       AND a.attnum > 0 AND NOT a.attisdropped 
       ORDER BY a.attnum 
/Users/thisguy/repositories/acmecorp/db/seeds.rb:1:in `<top (required)>' 
/Users/thisguy/repositories/acmecorp/rakefile.rb:30:in `require_relative' 
/Users/thisguy/repositories/acmecorp/rakefile.rb:30:in `block (2 levels) in <top (required)>' 

Caused by: 
PG::UndefinedTable: ERROR: relation "applications" does not exist 
LINE 8:    WHERE a.attrelid = '"applications"'::regclass 
             ^
/Users/thisguy/repositories/acmecorp/db/seeds.rb:1:in `<top (required)>' 
/Users/thisguy/repositories/acmecorp/rakefile.rb:30:in `require_relative' 
/Users/thisguy/repositories/acmecorp/rakefile.rb:30:in `block (2 levels) in <top (required)>' 
Tasks: TOP => db:seed 
(See full trace by running task with --trace) 

Meine database.yml Datei:

# config/database.yml 
default: &default 
    host: 'localhost' 
    adapter: 'postgresql' 
    encoding: utf-8 

development: 
    <<: *default 
    database: 'acmecorp_dev' 
    username: 'acmecorpapp' 

Die Gemfile ist ziemlich einfach:

# Gemfile 
source 'https://rubygems.org' 

gem 'activerecord' 
gem 'require_all' 
gem 'pg' 

Ich habe eine rakefile.rb, um die verschiedenen Aufgaben zu steuern (bearbeitet, um irrelevante Elemente zu entfernen):

Wie bereits erwähnt, funktionieren alle anderen Aufgaben in der Rakefile ohne Problem - es ist nur die :seed Aufgabe, die rülpst. Ich bin ziemlich sicher, dass es etwas damit zu tun hat, wie das Skript mit der Datenbank interagiert. Hier

ist die Seed-Datei:

# db/seeds.rb 
Application.create({ 
    ApplicationNumber: 1, 
    AccountNumber: 1234, 
    ApplVer: 1, 
    CreateDateTime: "1/2/2018", 
    ExpirationDateTime: "1/5/2019", 
    ApplicationStatus: "In process", 
    ApprovedAmount:  1992.92, 
    AcceptedAmount:  92.92, 
    HomeAddressLine1: "1 Main Street", 
    HomeAddressLine2: "", 
    HomeAddressCity: "Thibodaux", 
    HomeAddressState: "LA", 
    HomeAddressZipCode: "12345" 
}) 

und schließlich, ich habe ein einfaches Modell für die Anwendung, die die seeds.rb Dateiverweise:

# models/application.rb 
class Application < ActiveRecord::Base 
end 

Nun ist die Fehlermeldung oben erwähnt gibt an, dass "relation" -Anwendungen "nicht existiert" ... aber wenn ich den gleichen SQL in der Nachricht zitiert, direkt in pgAdmin, hier ist, was ich bekomme (Entschuldigung für die Formatierung - konnte nicht herausfinden, wie Sie es bekommen eine Tabelle effizient):

attname|format_type|pg_get_expr|attnotnull|atttypid|atttypmod|collname|comment 
id|integer|nextval('applications_id_seq'::regclass)|t|23|-1|| 
ApplicationNumber|integer||f|23|-1|| 
AccountNumber|integer||f|23|-1|| 
ApplVer|integer||f|23|-1|| 
CreateDateTime|timestamp without time zone||f|1114|-1|| 
ExpirationDateTime|timestamp without time zone||f|1114|-1|| 
ApplicationStatus|character varying||f|1043|-1|| 
ApprovedAmount|numeric||f|1700|-1|| 
AcceptedAmount|numeric||f|1700|-1|| 
HomeAddressLine1|character varying||f|1043|-1|| 
HomeAddressLine2|character varying||f|1043|-1|| 
HomeAddressCity|character varying||f|1043|-1|| 
HomeAddressState|character varying||f|1043|-1|| 
HomeAddressZipCode|character varying||f|1043|-1|| 
FileCreatedDate|timestamp without time zone||f|1114|-1|| 
created_at|timestamp without time zone||t|1114|-1|| 
updated_at|timestamp without time zone||t|1114|-1|| 

Unterm Strich also scheint zu sein: - zumindest so weit wie das Erstellen, Löschen und Migration von Datenbanken - - das Script mit PG arbeiten konfiguriert ist, die rake db:seed Aufgabe versagt - das berichtet SQL in die Fehlermeldung in der Befehlszeile funktioniert gut, wenn es durch pgAdmin

Ich bin mir nicht sicher, warum das Problem. Könnte es etwas mit Privilegien zu tun haben, die für den Benutzer verfügbar sind, der der Datenbank in der database.yml .. zugewiesen wurde?

+0

könnte es sein, waren Sie als acmecorpapp angemeldet, wenn Sie die SQL selbst ausgeführt haben? –

Antwort

0

Okay, herausgefunden, nach Chivorn Kouchs Vorschlag oben. Lösung erfordert eine zusätzliche db_config-Variable und eine Änderung an der :seed Aufgabe.

Im rakefile.rb:

# rakefile.rb 
namespace :db do 
    env = 'development' || ENV['env'] 

    db_config  = YAML::load(File.open('config/database.yml'))[env] 
    db_config_admin = db_config.merge({ 'database' => 'postgres','schema_search_path' => 'public' }) 
    # add following line to create variable for the :seed task 
    db_config_seed = db_config.merge({ 'schema_search_path' => 'public' }) 

    ... 

    desc "Seed the database" 
    task :seed do 
    # change variable referenced in the connection line below 
    ActiveRecord::Base.establish_connection(db_config_seed) 
    require_all 'models/*.rb' 
    require_relative 'db/seeds.rb' 
    puts "Database seeded." 
    end 

    ... 

end 

Mit diesen Änderungen werden die Befehle alle Arbeiten wie erwartet.

+0

Froh, dass Sie es herausgefunden haben. –

2

Bitte überprüfen Sie die Datei rakefile.rb. Es scheint, dass Sie die falsche Datenbank zusammenführen. Die Datenbank für die Entwicklung ist acmecorp_dev, und Sie haben es bereits in db_config. Ich denke, du musst database nicht mehr verschmelzen. Versuchen Sie dies:

require "active_record" 
require "require_all" 
require "yaml" 

namespace :db do 
    env = 'development' || ENV['env'] 

    db_config  = YAML::load(File.open('config/database.yml'))[env] 
    db_config_admin = db_config.merge({ 'schema_search_path' => 'public'}) 

    ... 

    desc "Seed the database" 
    task :seed do 
    ActiveRecord::Base.establish_connection(db_config_admin) 
    require_all 'models/*.rb' 
    require_relative 'db/seeds.rb' 
end 

... 

end 
+0

ah - danke! Das schien zu funktionieren, um das Problem mit 'rake db: seed' zu beheben. Das einzige Problem ist, dass es jetzt eine persistent offene Verbindung zu geben scheint, die mich daran hindert, die db fallen zu lassen: 'acmecorp $ rake db: drop Rake abgebrochen! ActiveRecord :: StatementInvalid: PG :: ObjectInUse: FEHLER: kann die aktuell geöffnete Datenbank nicht löschen' – Scro

+0

@Scro Haben Sie Ihre Rails App gestoppt? –

+0

Ich führe keine Rails App aus. Ich versuche, nur mit ActiveRecord zu rollen, ohne das gesamte Rails-Framework. Ich lerne ziemlich viel darüber, wie ActiveRecord mit der Datenbank arbeitet, aber ich bin ein wenig verwirrt von einigen dieser Macken. Ich vermute, dass es in den Rails-Konfigurationsdateien usw. eine Logik gibt, die das behandelt, was mir vielleicht fehlt. – Scro

Verwandte Themen