[pyar] ejecutar script .sql en postgres

Gabriel Davini gabrielfranciscodavini en gmail.com
Vie Nov 27 03:21:33 ART 2015


Hola Javier

2015-11-27 1:54 GMT-03:00 Javier Marcon <javiermarcon en gmail.com>:

> Hola, estoy intentando ejecutar un script .sql que tiene varias
> sentencias sql y estuve probando de 2 formas y no logro hacer que me lo
> ejecute.
>
> La primera forma es usando psycopg2:
>
> >>> data = ""
> >>> cnnsttr = "user=postgres host=localhost password=%s dbname=postgres"
> % pasw
>

Realmente nunca lo uso asi. Siempre paso las opciones como keyword
arguments, me parece mucho más pythónico. Pero bueno, eso es cuestión de
gustos :)


> >>> from psycopg2 import connect
> >>> from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT
> >>> import re
> >>> with open(path,"r") as sf:
> ...     data = sf.read()
>

Quizás es un typo, pero acá lo tendrías que hacer es:

with open(path) as sf:
    data += sf.read()  # sin el '+' siempre te vas a quedar con la última
línea del script.

igual yo haría algo asi.

with open(path) as sf:
    script_lines = sf.readlines()

data = '\n'.join(script_lines)


> ...
> >>> pat = re.compile('--.*', re.MULTILINE)
> >>> data = pat.sub('', data)
> >>> conn = connect(cnnsttr)
> >>> conn.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT)
> >>> cur = conn.cursor()
> >>> cur.execute(data)
> Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
> psycopg2.ProgrammingError: syntax error at or near ""
> LINE 1: 
>         ^
>
> >>>
>
> La parte de re es para sacarle los comentarios de sql, pero si no la
> pongo obtengo el mismo error. Si al script sql lo ejecuto con psql o en
> una ventana de sql de pgadminIII, funciona perfecto, pero no puedo
> hacerlo funcionar desde Python. Dicho archivo solo tiene sentencias
> CREATE TABLE, CREATE INDEX y comentarios (que empiezan con -- o ---).
>
> La segunda forma es:
>
> >>> import re, os, subprocess
> >>> d = dict(os.environ)
> >>> d['PGPASSFILE'] = pasw
> >>> work = subprocess.Popen(['psql',
> ...     "-f%s" % path,
> ...     "-d%s" % 'javiermarcon_1',
> ...     "-h%s" % 'localhost',
> ...     "-U%s" % 'postgres'
> ...     ], env = d
> ...     )
> >>> Password for user postgres:
>
> En esta segunda forma queria ponerle work.wait() pero antes de eso se
> queda esperando la password (que le pasé por variable de entorno).
>

Si no entiendo mal, la PGPASSFILE espera un path de donde leer el password
y vos le estás pasando el pwd directamente.

Igual yo le pasaría el pwd usando la opción -w de psql, en vez de pasarlo
como entorno. Me parece más legible.

Si vas a seguir por este camino te recomendaría que le pegues una mirada a
sh[0].

Saludos!

[0] https://github.com/amoffat/sh
-- 
Gabriel.

2015-11-27 1:54 GMT-03:00 Javier Marcon <javiermarcon en gmail.com>:

> Hola, estoy intentando ejecutar un script .sql que tiene varias
> sentencias sql y estuve probando de 2 formas y no logro hacer que me lo
> ejecute.
>
> La primera forma es usando psycopg2:
>
> >>> data = ""
> >>> cnnsttr = "user=postgres host=localhost password=%s dbname=postgres"
> % pasw
> >>> from psycopg2 import connect
> >>> from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT
> >>> import re
> >>> with open(path,"r") as sf:
> ...     data = sf.read()
> ...
> >>> pat = re.compile('--.*', re.MULTILINE)
> >>> data = pat.sub('', data)
> >>> conn = connect(cnnsttr)
> >>> conn.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT)
> >>> cur = conn.cursor()
> >>> cur.execute(data)
> Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
> psycopg2.ProgrammingError: syntax error at or near ""
> LINE 1: 
>         ^
>
> >>>
>
> La parte de re es para sacarle los comentarios de sql, pero si no la
> pongo obtengo el mismo error. Si al script sql lo ejecuto con psql o en
> una ventana de sql de pgadminIII, funciona perfecto, pero no puedo
> hacerlo funcionar desde Python. Dicho archivo solo tiene sentencias
> CREATE TABLE, CREATE INDEX y comentarios (que empiezan con -- o ---).
>
> La segunda forma es:
>
> >>> import re, os, subprocess
> >>> d = dict(os.environ)
> >>> d['PGPASSFILE'] = pasw
> >>> work = subprocess.Popen(['psql',
> ...     "-f%s" % path,
> ...     "-d%s" % 'javiermarcon_1',
> ...     "-h%s" % 'localhost',
> ...     "-U%s" % 'postgres'
> ...     ], env = d
> ...     )
> >>> Password for user postgres:
>
> En esta segunda forma queria ponerle work.wait() pero antes de eso se
> queda esperando la password (que le pasé por variable de entorno).
>
> Alguien sabe como puedo ejecutar el script y que me funcione?
>
> Gracias,
>
> Javier.
> _______________________________________________
> pyar mailing list pyar en python.org.ar
> http://listas.python.org.ar/listinfo/pyar
>
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
> Argentina - http://www.usla.org.ar




-- 
Gabriel.
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20151127/bb2ff09c/attachment.html>


More information about the pyar mailing list