[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