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.
2008/10/24 Dani D. [email protected]:
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.
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.
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
[email protected]
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
On Fri, Oct 24, 2008 at 10:53 AM, Daniel R. Troitiño
[email protected] 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.
2008/10/24 Emili Parreño [email protected]:
Seguramente sea el tipo de tabla, para tener transcacciones debes usar
InnoDB
Yep, es el tipo de tabla.
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.
2008/10/24 Xavier N. [email protected]:
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.