2011-04-14 10 views
12

Estoy tratando de escribir un script de ruby ​​que interactúa con una base de datos PostgreSQL. Estoy tratando de reconstruir cómo hacerlo a partir de la documentación, pero un buen tutorial o código de muestra podría hacer maravillas para disminuir la cantidad de tiempo que se necesita para que funcione. Si alguien tiene un enlace, algunos consejos o algún código que podrían compartir estaría muy agradecido.Ruby PostgreSQL tutorials

Editar, hizo este tono más claro:

Nota: esto no tiene que ver con los carriles ActiveRecord, estoy escribiendo un script Ruby que van a participar en un programa que es totalmente independiente de los carriles.

+0

esto no tiene que ver con los rieles – providence

+0

hmm, creo que todo el mundo está un poco confundido. Intento usar ActiveRecord solo, no en rieles. Sin embargo, estaré encantado de ver cualquier información sobre la conectividad de la base de datos en ruby, ya que frecuentemente encuentro que hay una mejor manera de implementar las cosas. También será un buen recurso para los lectores futuros. – providence

+0

Puede usar ActiveRecord por separado de Rails, o usar otro ORM solo como Sequel o DataMapper. Yo prefiero Sequel; Recomiendo usar un ORM en lugar de codificar a mano el SQL para un DBM en particular. Si, en el futuro, necesita cambiar a un gestor de bases de datos diferente, es trivial con un ORM si lo admite. –

Respuesta

4

Sólo tiene que requerir la gema pg y establecer la conexión con la base de datos:

require 'pg' 

ActiveRecord::Base.establish_connection(:adapter => "postgresql" 
             :username => "username", 
             :password => "password", 
             :database => "database") 

Al definir modelos para heredar de ActiveRecord::Base van a utilizar esta conexión de base de datos. Todo lo demás debería funcionar como lo hace en Rails.

+9

¿Por qué se acepta esta respuesta? No responde tu pregunta, notaste que no trata con Rails o ActiveRecord. – broschb

+0

Está escribiendo un script simple de ruby, no quiere importar un marco completo no relacionado:/ –

+0

Active Record está perfectamente bien para trabajar con una conexión de base de datos. También puedes usar la gema Sequel si quieres algo un poco más ligero. AR era lo que sabía en ese momento y, por lo tanto, eso es lo que recomendé. –

20

Sea más específico sobre qué biblioteca postgresql está utilizando.

Voy a asumir la gema 'pg', aparte de ActiveRecord.

El origen del proyecto tiene un archivo html que puede ser útil. Ir a https://bitbucket.org/ged/ruby-pg/src/b477174160c8/doc/postgres.html Luego haga clic en "raw" en la parte superior derecha del html. Abra el archivo en su navegador web.

código Esta muestra le ayuda a conectar (copiado del archivo html):

require "postgres" 
conn = PGconn.connect("localhost", 5432, "", "", "test1") 
# or: conn = PGconn.open('dbname=test1') 
res = conn.exec("select * from a;") 

El objeto res es un PGresult. Desplácese hacia abajo a esa sección en el html para ver a qué métodos puede llamar.

Este enlace tiene un ejemplo PGresult: http://rubydoc.info/gems/pg/0.10.0/PGresult

Extracto:

require 'pg' 
conn = PGconn.open(:dbname => 'test') 
res = conn.exec('SELECT 1 AS a, 2 AS b, NULL AS c') 
res.getvalue(0,0) # '1' 
res[0]['b']  # '2' 
res[0]['c']  # nil 
+2

Por cierto, ese archivo html puede estar desactualizado. Creo que necesitas pedir 'pg' en lugar de 'postgres'. – Kelvin

14

confirmo, "postgres" paquete no está actualizado, es necesario "PG".

Me tomó mucho tiempo obtener un básico select * from films trabajando con ruby ​​y postgres. Como soy amable, aquí está mi código:

preparación postgres (base de datos = megatest user = Roger pass = 123456 tabla = películas)

$ su postgres 
psql 
CREATE USER roger WITH PASSWORD '123456'; 

GRANT ALL PRIVILEGES ON DATABASE megatest to roger; 

megatest=# GRANT SELECT ON films TO PUBLIC; 

preparación kit PG

sudo gem install pg 

Ruby Code

require 'pg' 

conn=PGconn.connect(:hostaddr=>"127.0.0.1", :port=>5432, :dbname=>"megatest", :user=>"roger", :password=>'123456') 
# or for a non IP address :host => 'my.host.name.com' instead of hostaddr 

# run the query 
res = conn.exec("SELECT * FROM films") 

# Ran only once in order to get field Name 
fieldArray=res.fields() 
fieldArray.each do |elem| 
    print "elem="+elem+"\n" 
end 

# print data from the query 
res.each{ |row| 
    puts "Code="+row["code"] +" title="+row["title"] +" did="+row["did"] +" date_prod="+row["date_prod"] +" kind="+row["kind"] +" len="+row["len"] 
} 

Resultados

[email protected]:/home/eblain/ruby# ruby postgresTest.rb 
Code=UA502 title=Bananas did=105 date_prod=1971-07-13 kind=Comedy len=01:22:00 
Code=UA503 title=Cowboy did=105 date_prod=1979-07-13 kind=Horror len=01:32:00 
Code=UA544 title=YoBro did=105 date_prod=1981-07-13 kind=Action len=01:42:00 
+1

Es difícil descifrar su respuesta. ¿Puedes arreglar el formato para que sea más útil? –

+0

¿Cuál sería el nombre de host para una instilación de postgres local en un mac? – HMLDude

3

Para declaraciones SQL parametrizadas, debe usar PGconn#exec_params, p. Ej.

conn = PGconn.new(:dbname => 'test') 
conn.exec_params(
    'INSERT INTO comedians (first_name, last_name) VALUES ($1, $2)', 
    ['Louis', 'CK']) 
conn.close 

Fuente: http://deveiate.org/code/pg/PGconn.html

Look here para obtener una lista completa de los parámetros que se pueden pasar a la PGconn constructor.

Cuestiones relacionadas