Transacciones


#1

Hola chicos,
estoy desarrollando un pequeño script de migración ( no es una
aplicación rails ) usando ActiveRecord, para una tabla de una base de
datos “legacy” a una tabla “standard”.
Estoy probando de usar transacciones y el siguiente ejemplo no me
funciona:

#!/usr/bin/env ruby

require ‘rubygems’
require ‘activerecord’

$config = YAML.load_file(File.join(File.dirname(FILE),
‘database.yml’))

class TotSonaDB < ActiveRecord::Base
establish_connection $config[‘tot-sona’]
end

module TotSona

class Client < TotSonaDB

    set_primary_key :cli_codi
    set_table_name  :clients

end

end

TotSona::Client.transaction do
client = TotSona::Client.find(:first)
client.cli_email = “SHOULD_NOT_BE_UPDATED
client.save!
raise ActiveRecord::Rollback
end

Mi database.yml es como sigue:

‘tot-sona’ :
adapter : mysql
host : localhost
username : test
password : test
database : tot-sona
socket : /var/run/mysqld/mysqld.sock

cli_email està vacio antes de la ejecución, pero despues de lanzar el
script està actualizado, por tanto el raise no acaba de funcionar.

He buscado en “un conocido buscador que empieza por G” y he visto que
la sintaxis de arriba es la correcta, por lo que no se por donde van
los tiros…

Info:
ActiveRecord 2.1.1
ruby 1.8.6
mysql 5.0.51a
Ubuntu 8.04.

Si alguien sabe algún recurso que explique gestión de transacciones,
lo agradecería inmensamente.


#2

2008/10/24 Dani D. removed_email_address@domain.invalid:

end
end

‘tot-sona’ :
adapter : mysql
host : localhost
username : test
password : test
database : tot-sona
socket : /var/run/mysqld/mysqld.sock

Crea un logger con nivel debug apuntando a STDERR y establecelo como
el logger de TotSonaDB, a ver que SQL está emitiendo ActiveRecord.

Por otro lado si es una base de datos antigua y las tablas de MySQL
utilizan el engine MyISAM, lo siento pero no tienes suerte: MyISAM no
soporta transacciones, InnoDB sí. Supongo que tendrías que
convertirlas de un engine al otro.


#3

Dani D. escribió:

    set_primary_key :cli_codi
raise ActiveRecord::Rollback

database : tot-sona
socket : /var/run/mysqld/mysqld.sock

cli_email està vacio antes de la ejecución, pero despues de lanzar el
script està actualizado, por tanto el raise no acaba de funcionar.

He buscado en “un conocido buscador que empieza por G” y he visto que
la sintaxis de arriba es la correcta, por lo que no se por donde van
los tiros…

Te refieres a la sintaxis del database.yml o de la transaccion?

Creo que esta no es la forma de usar transacciones en rails mira [1].

[1] http://wiki.rubyonrails.org/rails/pages/HowToUseTransactions

Un saludo.


#4

Seguramente sea el tipo de tabla, para tener transcacciones debes usar
InnoDB

El 24/10/2008, a las 10:22, Dani D.
escribió:

require ‘activerecord’
class Client < TotSonaDB
client.cli_email = “SHOULD_NOT_BE_UPDATED
username : test

Doni


Ror-es mailing list
removed_email_address@domain.invalid
http://lists.simplelogica.net/mailman/listinfo/ror-es


“Nos gustaría cambiar el mundo, pero no tenemos el código fuente”

Emili 
Parreñowww.eparreno.com
www.abecedata.com

#5

On Fri, Oct 24, 2008 at 10:53 AM, Daniel R. Troitiño
removed_email_address@domain.invalid wrote:

Por otro lado si es una base de datos antigua y las tablas de MySQL
utilizan el engine MyISAM, lo siento pero no tienes suerte: MyISAM no
soporta transacciones, InnoDB sí. Supongo que tendrías que
convertirlas de un engine al otro.
Argh! Horror!
Son todas MyISAM. La tabla es propiedad del cliente y probablemente no
pueda cambiar el motor.


#6

2008/10/24 Emili Parreño removed_email_address@domain.invalid:

Seguramente sea el tipo de tabla, para tener transcacciones debes usar
InnoDB
Yep, es el tipo de tabla.


#7

Si tienes MyISAM y necesitas abortar la migracion aun puedes guardarte
los IDs de registros creados y hacer bulk DELETES a mano en caso de
problema.


#8

2008/10/24 Xavier N. removed_email_address@domain.invalid:

Si tienes MyISAM y necesitas abortar la migracion aun puedes guardarte
los IDs de registros creados y hacer bulk DELETES a mano en caso de
problema.
Esta es buena, me la apunto.