From: | Gunnar Wolf <gwolf(at)gwolf(dot)org> |
---|---|
To: | Diego Schulz <dschulz(at)gmail(dot)com> |
Cc: | pgsql-es-ayuda(at)postgresql(dot)org |
Subject: | Re: pg_dump con campos bytea |
Date: | 2009-04-26 02:16:49 |
Message-ID: | 20090426021649.GF14590@cajita.gateway.2wire.net |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
Diego Schulz dijo [Thu, Apr 23, 2009 at 01:21:23PM -0400]:
> >> Me ahorro un solo problema importante (en mi caso): cuando intentaba
> >> insertar blobs en su respectiva tabla tenia unos warnings como este,
> >>
> >> WARNING: uso no estandar de \\ en un literal de cadena
> >> LINE 1: ...5253, '9c42d5b5ca53f123bfa2483d0dc0b2e09df493f0', '\\177ELF\...
> >> ^
> >> HINT: Use '' para escribir comillas en cadenas, o use la sintaxis
> >> de escape de cadenas (E'\\').
> >
> > ¿Y probaste a usar E'\\177ELF\...' como lo señala el hint?
> >
>
> Si, pero daba problemas usando parametros nombrados del tipo
>
> query.prepare("INSERT INTO archivo (nombre, rutaorig, descripcion,
> tam , hash , blob) "
> "VALUES ( :nombre, :rutaorig , :descripcion,
> :tam , :hash, E\'\\\\:blob'\' ) ");
>
> y tambien usando parametros posicionales
>
> query.prepare("INSERT INTO archivo (nombre, rutaorig, descripcion,
> tam , hash , blob) "
> "VALUES ( ?,?,?,?,?, E'\\\\?' ");
> (...)
Lo más común cuando trabajas con bytea es encargarle al conector de BD
hacer la conversión. Por ejemplo, en Perl:
$sth = $dbd->prepare('INSERT INTO archivo ' .
'(nombre, rutaorig, descripcion, blob) ' .
'VALUES (?, ?, ?, ?));
$sth->bind_param(1, $nombre);
$sth->bind_param(2, $ruta);
$sth->bind_param(3, $descr);
$sth->bind_param(4, $blob, {pg_type=>DBD::Pg::PG_BYTEA});
$sth->execute;
Esto es, "desdoblamos" la solicitud especificando a cada uno de los
parámetros por separado. bind_param acepta opcionalmente el tercer
atributo, donde estamos indicando el tipo de datos a emplear (y es
DBD::Pg quien se encarga de codificarlo). Al recuperar los datos no
hace falta escapar nada.
En Ruby hago algo similar (a través de ActiveRecord) el acceso es
completamente transparente - El framework se encarga de estas
minucias.
Como sea, si quisieras codificar los datos para pasarlos a través de
una cadena armada como lo estabas especificando, te puede servir esta
función que alguna vez hice - aunque dista de ser perfecta
(especialmente en lo concerniente al rendimiento). Está escrita en
Perl, y recibe como único parámetro un filehandle a leer:
sub escape_octal {
my ($fh, $out, $in);
$fh = shift;
while (my $in = <$fh>) {
$out .= join('', map {
my $ord = ord($_);
($ord >= 32 and $ord <= 126 and ord != 92) ? $_ :
sprintf('\\%03o', $ord);
} split (//, $in));
}
return $out;
}
--
Gunnar Wolf - gwolf(at)gwolf(dot)org - (+52-55)5623-0154 / 1451-2244
PGP key 1024D/8BB527AF 2001-10-23
Fingerprint: 0C79 D2D1 2C4E 9CE4 5973 F800 D80E F35A 8BB5 27AF
From | Date | Subject | |
---|---|---|---|
Next Message | Gunnar Wolf | 2009-04-26 02:26:49 | Re: puede postgresql venderse?? |
Previous Message | José Fermín Francisco Ferreras | 2009-04-25 22:33:06 | RE: Pagina PostgreSQL en Espanol (http://www.postgresql-es.org/) |