2017-02-28 3 views
0

Ich erstellte drei DB-Schemas mit Postgres. Die Tische sind definitiv da, ich habe die Shell mit \dt benutzt um sie zu sehen.Wie Einfügen in Postgres-Tabelle mit dem PG-Edelstein

Mein SqlRunner schlägt fehl, wenn ich versuche, mit meiner seeds.rb-Datei einen INSERT zu erstellen. Das Terminal gibt einen PG :: SyntaxError bei oder in der Nähe von "11.18" zurück. Die vorherige Zeile ist auch ein Float, also weiß ich nicht, was los ist.

Das Modell sieht so aus:

require('pg') 
require('../project_giclee_db/sql_runner') 


class Material 

    attr_reader :id, :product_name, :guk_name, :roll_width_in, :roll_length_metres, :list_price, :cost_per_sqm, 
    :cost_per_sqm_with_ink, :factor_n, :sell_per_sqm, :rounded_sale_price 


    def initialize(options) 
    @id = options['id'].to_i 
    @product_name = options['product_name'] 
    @guk_name = options['guk_name'] 
    @roll_width_in = options['roll_width_in'].to_i 
    @roll_length_metres = options['roll_length_metres'].to_i 
    @list_price = options['list_price'].to_f 
    @cost_per_sqm = options['cost_per_sqm'].to_f 
    @cost_per_sqm_with_ink = options['cost_per_sqm_with_ink'].to_f 
    @factor_n = options['factor_n'].to_f 
    @sell_per_sqm = options['sell_per_sqm'].to_f 
    @rounded_sale_price = options['rounded_sale_price'].to_i 

    end 


    def save 
    sql = "INSERT INTO materials (product_name, guk_name, roll_width_in, roll_length_metres, 
    list_price, cost_per_sqm, cost_per_sqm_with_ink, factor_n, sell_per_sqm, rounded_sale_price) 
    VALUES (#{@product_name}, #{@guk_name}, #{@roll_width_in}, #{@roll_length_metres}, #{@list_price} 
    #{@cost_per_sqm}, #{@cost_per_sqm_with_ink}, #{@factor_n}, #{@sell_per_sqm}, #{@rounded_sale_price} 
    ) RETURNING *" 

    data = SqlRunner.run(sql).first 
    @id = data['id'] 
    end 


    def self.delete_all 
    sql = "DELETE FROM materials" 
    SqlRunner.run(sql) 
    end 

end 

Runner wie folgt aussieht:

require('pg') 

class SqlRunner 

    def self.run(sql) 
    begin 
    db = PG.connect({dbname: 'giclee_db', host: 'localhost'}) 
    result = db.exec(sql) 
    ensure 
    db.close 
    end 
    return result 
end 

end 

Seed-Daten wie folgt aussieht:

require('../models/materials') 
require('pry-byebug') 

Material.delete_all 

@material1 = Material.new({ 'product_name' => 'giclee_canvas', 'guk_name' => 'canvas', 
'roll_width_in' => 44, 'roll_length_metres' => 12, 'list_price' => 150.00, 
'cost_per_sqm' => 11.18, 'cost_per_sqm_with_ink' => 14.18, 'factor_n' => 11.00, 
'sell_per_sqm' => 156.03, 'rounded_sale_price' => 156 
}) 


@material1.save 
+0

ich mit sehr empfehlen würde [Sequel] (http://sequel.jeremyevans.net), wenn auf Datenbanken, wenn Sie im Gespräch Verwenden Sie keine Rails. Es ist ein sehr gutes ORM, das es viel einfacher macht, Abfragen oder Anweisungen zu generieren, ohne sich um die Syntax kümmern zu müssen. Pg erzwingt das Schreiben von SQL speziell für PostgreSQL. Sequel lässt Sie Ruby verwenden, um das SQL zu generieren, und ist DBM-agnostisch [unterstützt viele verschiedene DBMs] (http://sequel.jeremyevans.net/rdoc-adapters/index.html), und Sie ändern nur Ihr DSN, um es automatisch zu haben Generieren Sie gleichwertige Abfragen für einen anderen Datenbanktyp. –

+0

In Ruby ist es idiomatisch, keine Klammern um den 'require' Parameter zu verwenden. Auch '@ material1' zeigt, dass Sie Variablen und deren Gültigkeitsbereich nicht mit Ruby verstehen. Ich würde empfehlen, sich mit Klassen-, Instanz- und lokalen Variablen und Konstanten vertraut zu machen. –

+0

In Ordnung! Hatte einen Blick, scheint vielversprechend. Ich bin bereit, mit pg zu trainieren, ich möchte nur eine Datenbank modellieren. Ich werde später Schienen verwenden, um die API zu erstellen. Sequel sieht benutzerfreundlicher aus. Danke @The Tin Man – godhar

Antwort

0

Sie Anführungszeichen um die Saiten haben sollte:

def save 
sql = "INSERT INTO materials (product_name, guk_name, roll_width_in, roll_length_metres, 
list_price, cost_per_sqm, cost_per_sqm_with_ink, factor_n, sell_per_sqm, rounded_sale_price) 
VALUES ('#{@product_name}', '#{@guk_name}', #{@roll_width_in}, #{@roll_length_metres}, #{@list_price} 
#{@cost_per_sqm}, #{@cost_per_sqm_with_ink}, #{@factor_n}, #{@sell_per_sqm}, #{@rounded_sale_price} 
) RETURNING *" 

    data = SqlRunner.run(sql).first 
    @id = data['id'] 
end 
+0

guten Ruf @eiko, aber ich bekomme den gleichen Fehler. Mache die Veränderung, Fortschritt ist Fortschritt. – godhar

0

Das Problem ist, ein fehlendes Komma am Ende der Zeile in der SQL:

VALUES ('#{@product_name}', '#{@guk_name}', #{@roll_width_in}, #{@roll_length_metres}, #{@list_price} 
+0

Zeilenumbrüche in Variable SQL ist auch schlecht. Versuchen Sie ohne Zeilenumbrüche. sql = „in Materialien Einsatz (product_name, guk_name, roll_width_in, roll_length_metres, list_price, cost_per_sqm, cost_per_sqm_with_ink, factor_n, sell_per_sqm, rounded_sale_price) VALUES ('# {@ product_name}', '# {@ guk_name}', # {@ roll_width_in}, # {@ roll_length_metres}, # {@ list_price}, # {@ cost_per_sqm}, # {@ cost_per_sqm_with_ink}, # {@ factor_n}, # {@ sell_per_sqm}, # {@ gerundet_sale_price}) RETURNING * " –

+0

ja . Vielen Dank. – godhar

+0

Warum ist es schlecht @ rafael.cote? – godhar

Verwandte Themen