[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