Segun entiendo el metodo a cargo de realizar la conversion entre pl/python y postgre es mogrify


//Extracto del trigger

  # function to convert value from python to postgres representation
  def mogrify(v):
    if v is None: return 'NULL'
    if isinstance(v,basestring):
       r = repr(v)
       if not r.startswith('\"'):
          return r
       else:
          # postgres doesn't support ", replace and escape '
          return "'%s'" % r.replace("'","\\'")[1:-1]
    return "'%s'" % repr(v) # to get rid of bool that are passed as ints (solved in pg8.3)


quizas deba agregarse alguna condicion en el if??

saludos.


Javier Fritz Alsite wrote:
Hola.

    Como estan, hace algun tiempo pedi ayuda sobre una solución de replicación, he optado por PyReplica , y tengo el siguiente problema.quizas de simple la solución,

    Tengo 3 servidores, cada uno tiene conexión con dos maestros remotos, funciona aceptablemente bien, esta montado en servidores con salida a internet con un trafico aun de prueba.

    Al grano, al  realizar una insercion en una tabla que posee un campo bigint, el triger esta capturando el query pero para el valor de este campo lo concatena con "L", no se si esto es correcto, ya que al ejectuar este query, se por el esclavo  pyreplica o extrayendolo manualmente y ejecutandolo sobre la base genera el error.

Query capturado por py_log_replica():

INSERT INTO "sys_tablas" ("id_fila", "horacreacion", "tab_fecha5", "tab_fecha4", "tab_fecha3", "tab_fecha2", "tab_fecha1", "tab_codigo", "uscreacion", "tab_texto2", "tab_texto3", "usmodif", "tab_texto1", "tab_texto4", "tab_texto5", "tab_valor4", "tab_valor5", "tab_tipo", "tab_valor1", "tab_valor2", "tab_valor3", "tab_desctabla", "fecmodif", "horamodif", "tab_codtabla", "feccreacion", "tab_estado", "tab_desc", "tab_activo") VALUES ('1411L', '161847', '', '', '', '', '', '0102', 'root', '', '', NULL, '', '', '', '0.0', '0.0', 'S', '1.0', '0.0', '0.0', 'Vendedores', NULL, NULL, '1', '20091002', '', '0102', 'S')

la tabla posee casi todos sus campo varchar y posee solo 1 bigint, que es "id_fila" y el valor entregado segun el triger es 1411L en la tabla original el query ejecutado es:


INSERT INTO "sys_tablas" ("id_fila", "horacreacion", "tab_fecha5", "tab_fecha4", "tab_fecha3", "tab_fecha2", "tab_fecha1", "tab_codigo", "uscreacion", "tab_texto2", "tab_texto3", "usmodif", "tab_texto1", "tab_texto4", "tab_texto5", "tab_valor4", "tab_valor5", "tab_tipo", "tab_valor1", "tab_valor2", "tab_valor3", "tab_desctabla", "fecmodif", "horamodif", "tab_codtabla", "feccreacion", "tab_estado", "tab_desc", "tab_activo") VALUES (1411, '161847', '', '', '', '', '', '0102', 'root', '', '', NULL, '', '', '', 0.0, 0.0, 'S', 1.0, 0.0, 0.0, 'Vendedores', NULL, NULL, '1', '20091002', '', '0102', 'S')

este ultimo corre sin problemas.



Al ejectuar el primer query directo:
ERROR:  error de sintaxis en o cerca de «L»

Al hacerlo con los esclavos corriendo
PyReplica notifica via email (por cada esclavo):
Traceback (most recent call last):
  File "/usr/local/pyreplica/daemon.py", line 74, in run
    debug = self.debug)
  File "/usr/local/pyreplica/pyreplica.py", line 154, in main_loop
    replicate(cur0, cur1, skip_user, slave_field, debug)
  File "/usr/local/pyreplica/pyreplica.py", line 92, in replicate
    cur1.execute(sql)
DataError: la sintaxis de entrada no es válida para integer: «1411L»
  



--
Javier Fritz