[pyar] ejecutar script .sql en postgres
Javier Marcon
javiermarcon en gmail.com
Vie Nov 27 13:22:25 ART 2015
Gracias, mi respuesta entre lineas.
El 27/11/15 a las 03:21, Gabriel Davini escribió:
> Hola Javier
>
> 2015-11-27 1:54 GMT-03:00 Javier Marcon <javiermarcon en gmail.com
> <mailto:javiermarcon en gmail.com>>:
>
> ...
>
>
> 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 :)
Tenes razon, pero lo había probado y no me funcionó, algo hice mal.
>
> >>> 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)
>
En relaidad no hice el += porque read me devuelve todo el contenido del
archivo (incluso lo vi con un print), cual es la ventaja de procesar
linea por linea y unirlas en lugar de procesar todo el archivo junto?
>
> ...
> >>> 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.
>
Gracias, de eso no me había dado cuenta
> 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.
>
Buena idea, pero la opción -w foerza que e pida el password con un
prompt para escribirlo, como le digo a popen
> Si vas a seguir por este camino te recomendaría que le pegues una
> mirada a sh[0].
>
Gracias, primero voy a tratar de no incorporar librerias adicionales, si
no me queda mas remedio voy a ver lo de sh.
...
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20151127/bcbcb461/attachment-0001.html>
More information about the pyar
mailing list