Forum: Rails-ES Transacciones

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Dani D. (Guest)
on 2008-10-24 12:23
(Received via mailing list)
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.
Daniel R. Troitiño (Guest)
on 2008-10-24 12:54
(Received via mailing list)
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.
cartuchoGL (Guest)
on 2008-10-24 13:25
(Received via mailing list)
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.
Emili P. (Guest)
on 2008-10-24 14:07
(Received via mailing list)
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
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Dani D. (Guest)
on 2008-10-24 14:09
(Received via mailing list)
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.
Dani D. (Guest)
on 2008-10-24 14:09
(Received via mailing list)
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.
Xavier N. (Guest)
on 2008-10-24 19:00
(Received via mailing list)
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.
Dani D. (Guest)
on 2008-10-24 19:13
(Received via mailing list)
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.
This topic is locked and can not be replied to.