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
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. –
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. –
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