2009/10/2 Javier Fritz Aliste <[email protected]>

>  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.
>
>
Hola Javier, parece ser un tema de conversión entre postgresql y python, una
solucion podria ser modificar el código del disparador en plpython para que
detecte los bigint de pg (long en python) y no le agregue la L al
convertirlos para el query sql:

  # function to convert value from python to postgres representation
  def mogrify(v):
    if v is None: return 'NULL'
    if isinstance(v,long): return str(v) # no agregar L a long (bigint)
    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)

Lo que hay que agregar es la linea verde despues de if v is None..
(respetando la identación):
if isinstance(v,long): return str(v)

No lo probé pero tendría que funcionar, cualquier cosa avisame
Sds
Mariano

Responder a