RubyLit - Ruby.del.litoral!
usando postgresql a pelo

Script básico

Ejemplo de: CREATE TABLE, DROP TABLE IF EXIST, INSERT, TRUNCATE TABLE.

script con varias formas de INSERT.

script con transacciones (COMMIT, ROLLBACK) y mensajes

script con uso de select.

script con un cursor.


Script Básico

require 'rubygems'
require 'pg'

dropear_tabla = "drop table if exists jugadores;" 

crear_tabla = "create table jugadores (
id integer,
nombre varchar(40),
apellidos varchar(40),
nick char(15),
fnacimiento date);" 

insertar_1 = "insert into jugadores values (1000001, 'angel amadeo', 'labruna', 'el feo', '28-11-1918');" 

truncar_tabla = "truncate table jugadores;" 

# string de coneccion
conn = PGconn.connect("127.0.0.1", 5432, '', '', "template1", "postgres", "pwdxyz")

# Elimino la tabla si existe.
res = conn.exec(dropear_tabla)

# Creo la tabla
res = conn.exec(crear_tabla)

# Agrego un registro
res = conn.exec(insertar_1)

# Elimino todos los registros de la tabla
res = conn.exec(truncar_tabla)

script con varias formas de INSERT.

require 'rubygems'
require 'pg'

def mostrarMensajes(mensaje, resultado)
print "\n", mensaje, "\n" 
print "cmd_status: #{resultado.cmd_status}\n" 
print "cmdtuples: #{resultado.cmdtuples}\n" 
print "num_fields: #{resultado.num_fields}\n" 
print "num_tuples: #{resultado.num_tuples}\n" 
end

conn = PGconn.connect("127.0.0.1", 5432, '', '', "template1", "postgres", "pwdxyz")

#ejecuto el comando truncate para limpiar la tabla
res = conn.exec("truncate table jugadores;")
mostrarMensajes("Truncate table", res)

#escribo el insert completo
res = conn.exec("insert into jugadores values (1000001, 'ángel amadeo', 'labruna', 'el feo', '28-11-1918');")
mostrarMensajes("Insert completo:", res)

#uso una variable para hacer el insert
ins = "insert into jugadores values (1000002, 'bernabé', 'ferreyra', 'la fiera', '12-02-1908');" 
res = conn.exec(ins)
mostrarMensajes("Insert con variable:", res)

#uso una variable para hacer el insert, la variable tiene reemplazos al estilo ruby
id = 1000003
nombre = 'juan gilberto'
apellido = "funes" 
nick = "el bufalo" 
fnac = '08-03-1963'
ins = "insert into jugadores (id, nombre, apellidos, nick, fnacimiento) values (#{id}, '#{nombre}', '#{apellido}', '#{nick}', '#{fnac}');" 
res = conn.exec(ins)
mostrarMensajes("Insert con variable y reemplazos:",res)

#una variable con varios insert
ins = "insert into jugadores values (1000004, 'enzo', 'francescoli', 'el principe', '12-11-1961');
insert into jugadores values (1000005, 'josé manuel', 'moreno', 'el charro', '03-08-1916');" 
res = conn.exec(ins)
mostrarMensajes("Varios insert en una variable: ", res)

#uso un array para hacer los insert
vector = []
vector.push("insert into jugadores values (1000006, 'ubaldo matildo', 'fillol', 'el pato', '21-06-1950');")
vector.push("insert into jugadores values (1000007, 'radamel', 'falcao garcía', 'el tigre', '12-02-1986');")
vector.push("insert into jugadores values (1000008, 'juan pablo', 'angel', 'angelito', '24-10-1975');")
vector.push("insert into jugadores values (1000009, 'norberto osvaldo', 'alonso', 'el beto', '04-01-1956');")
vector.push("insert into jugadores values (1000010, 'ramón ángel', 'díaz', 'pelado', '29-08-1959');")
vector.push("insert into jugadores values (1000011, 'walter', 'gomez', null, '12-12-1927');")

vector.each do |ins|
    res = conn.exec(ins)
    mostrarMensajes("Dentro del loop, insertando con arrays", res)
end

conn.close() if conn

script con transacciones (COMMIT, ROLLBACK) y mensajes

require 'rubygems'
require 'pg'

def mostrarMensajes(mensaje, resultado)
print "\n", mensaje, "\n" 
print "cmd_status: #{resultado.cmd_status}\n" 
print "cmdtuples: #{resultado.cmdtuples}\n" 
print "num_fields: #{resultado.num_fields}\n" 
print "num_tuples: #{resultado.num_tuples}\n" 
end

conn = PGconn.connect("127.0.0.1", 5432, '', '', "template1", "postgres", "pwdxyz")

# incio la transaccion
res = conn.exec("begin;")

# inserto un registro
res = conn.exec("insert into jugadores values (10001000, 'ángel clemente', 'rojas', 'rojitas', '28-08-1944');")

# muestro el registro insertado
res = conn.exec("select * from jugadores where id=10001000;")
if res.num_tuples > 0
    print "id: #{res[0]['id']} \n" 
    print "Nombres: #{res[0]['nombre']} \n" 
    print "Apellidos: #{res[0]['apellidos']} \n" 
    print "Apodo: #{res[0]['nick']} \n" 
    print "Fecha de N.: #{res[0]['fnacimiento']} \n" 
end

#deshago el insert.
res = conn.exec("rollback;")

#busco el registro que antes se insertó y mostró
res = conn.exec("select * from jugadores where id=10001000;")
if res.num_tuples > 0
    print "id: #{res[0]['id']}\n" 
    print "Nombres: #{res[0]['nombre']}\n" 
    print "Apellidos: #{res[0]['apellidos']}\n" 
    print "Apodo: #{res[0]['apellidos']}\n" 
    print "Fecha de N.: #{res[0]['fnacimiento']}\n" 
else
    print "¡Rojitas no está!\n" 
end

#transaccion en una sola linea.
confirmar = 'commit;'
confirmar = 'rollback;'
apodo = 'rojitas'
ins = "begin;
insert into jugadores values (10001000, 'ángel clemente', 'rojas', '#{apodo}', '28-04-1944');
#{confirmar};" 

res = conn.exec(ins)

conn.close() if conn

script con uso de select.

require 'rubygems'
require 'pg'

conn = PGconn.connect("127.0.0.1", 5432, '', '', "template1", "postgres", "pwdxyz")

res = conn.exec("select id, COALESCE(nick, rpad('No tiene',15,'-')) as nvl, apellidos, nombre, fnacimiento from jugadores order by apellidos;")

res.each do |registro|
    print registro['id'], ", ", registro['nvl'], ", ",
registro['apellidos'], "; ", registro['nombre'], ", ", registro['fnacimiento'], "\n" 
end

conn.close() if conn

script con un cursor.

Quizás alguien se pregunte cual es el motivo para usar un cursor…, bueno la respuesta es que se deben usar cursores cuando hay muchos registros a procesar. Yo los he usado en múltiples oportunidades cuando trabajaba en una telefónica y con tablas que contenían tráfico (llamadas telefónicas)

#! /usr/bin/env ruby
#
# original file src/test/examples/testlibpq.c
# 
require 'rubygems'
require 'pg'

def main
    conn = PGconn.connect("127.0.0.1", 5432, '', '', "template1", "postgres", "pwdxyz")

    if $DEBUG
        #
        # para usar esta opcion se debe ejecutar de la siguiente forma
        # ruby -d test_cursor2.rb
        #
        fd = open("./trace.out","w")
        conn.trace(fd)
    end 

    res = conn.exec("BEGIN")
    res.clear

    res = conn.exec("DECLARE myportal CURSOR FOR select nombre, apellidos, fnacimiento from jugadores order by fnacimiento;")
    res.clear

    res = conn.exec("FETCH 2 in myportal")
    while res.num_tuples > 0 do
        res.each do |tupl|
            print tupl['fnacimiento'], ", ",tupl['apellidos'], ", ", ['nombre'], "\n" 
        end
        res = conn.exec("FETCH 2 in myportal")
    end

    res = conn.exec("CLOSE myportal")
    res = conn.exec("END")
    res.clear
    conn.close

    if $DEBUG
        fd.close
    end
end

main