dissabte, 5 de febrer del 2011

Com fer servir PostgreSQL amb Python. Mòdul Psycopg2

Per a desenvolupar aplicacions que facin servir PostgreSQL amb Python, el primer pas és instal·lar algun mòdul que permeti accedir a la base de dades des del llenguatge.

El mòdul més popular per accedir a PostgreSQL amb Python és Psycopg2 (http://initd.org/psycopg/).

Instal·lar aquest mòdul a la una distribució Ubuntu no presenta cap dificultat perquè està disponible al "Centre de Programari de l'Ubuntu".

També instal·lo la testsuite i l'extensió de debug, tot des del "Centre de Programari de l'Ubuntu"



Un cop instal·lats, ja es pot treballar. El primer  pas és revisar la documentació i els exemples. La documentació en línia la podem trobar a http://initd.org/psycopg/docs/. I ha un altre enllaç molt interessant a la wiki de PostgreSQL: http://wiki.postgresql.org/wiki/Using_psycopg2_with_PostgreSQL.

Encara millor: podem utilitzar la documentació local de Python. si a la consola fem pydoc -g, se'ns obrirà   aquesta petita aplicació, que és un mini servidor web de les pàgines HTML de l'ajuda de Python i els seus mòduls:


A més, compta amb un cercador molt senzill amb el que podrem consultar sobre el mòdul que acabem d'instal·lar, el psycopg2. Fent click als tòpics trobats


Ens obrirà un navegador amb la pàgina desitjada.

Doncs bé, un cop vist això, el que faré serà un experiment molt senzill que consistirà en connectar-se a una base de dades existent i executar-hi consultes.

Primer de tot, amb l'Anjuta, creo un projecte nou del tipus Python generic. Per a fer les coses més fàcils, copio l'script de prova disponible

#!/usr/bin/python
# coding: latin-1
#
import psycopg2
import sys


def main():
#Defineix la cadena de connexió
conn_string = "host='localhost' dbname='proves' user='postgres' password='postgres'"
# la mostra
print "Connectant a la base de dades\n ->%s" % (conn_string)
try:
# obté una connexió, si no es pot connectar, llença una excepció
conn = psycopg2.connect(conn_string)

# conn.cursor retorna un objecte cursor, per a fer les consultes.
cursor = conn.cursor()

print "Connectat!\n"
except:
# obté informació de l'excepció
exceptionType, exceptionValue, exceptionTraceback = sys.exc_info()
# mostra la informació i acaba.
sys.exit("Database connection failed!\n ->%s" % (exceptionValue))


# final
if __name__ == "__main__":
sys.exit(main()) 

Des del mateix Anjuta puc provar:


EXECUTING:
/media/DISC57GB/wk-python/ProvaPG/src/prova_pg.py 
----------------------------------------------
Connectant a la base de dades
->host='localhost' dbname='proves' user='postgres' password='postgres'
Connectat!




----------------------------------------------
Program exited successfully with errcode (0)
Press the Enter key to close this terminal ... 


Net i a la primera. Ara faré una consulta, afegeixo


#!/usr/bin/python
# coding: latin-1
#
import psycopg2
import sys


def main():
#Defineix la cadena de connexió
conn_string = "host='localhost' dbname='proves' user='postgres' password='postgres'"
# la mostra
print "Connectant a la base de dades\n ->%s" % (conn_string)
try:
# obté una connexió, si no es pot connectar, llença una excepció
conn = psycopg2.connect(conn_string)

# conn.cursor retorna un objecte cursor, per a fer les consultes.
cursor = conn.cursor()

print "Connectat!\n"

# executa una consulta
cursor.execute("SELECT * FROM taula1")


# recupera files de la taula
v_files = cursor.fetchall()

print "Retorna: " + str(cursor.rowcount) + " files"


# mostra les files 
for v_fila in v_files:
print str(v_fila[0]) + " ; " + v_fila[1] + " ; " + v_fila[2]

# i surt
conn.close()
except:
# obté informació de l'excepció
exceptionType, exceptionValue, exceptionTraceback = sys.exc_info()
# mostra la informació i acaba.
sys.exit("Database connection failed!\n ->%s" % (exceptionValue))


# final
if __name__ == "__main__":
sys.exit(main())


I el resultat, com calia esperar:

EXECUTING:
/media/DISC57GB/wk-python/ProvaPG/src/prova_pg.py 
----------------------------------------------
Connectant a la base de dades
->host='localhost' dbname='proves' user='postgres' password='postgres'
Connectat!


Retorna: 5 files
1 ; valor 1 ; traducció 1
2 ; valor 2 ; traducció 2
3 ; valor 3 ; traducció 3
4 ; valor 4 ; traducció 4
5 ; valor 5 ; traducció 5


----------------------------------------------
Program exited successfully with errcode (0)
Press the Enter key to close this terminal ...

Un senzill experiment de com utilitzar PostgreSQL amb scripts de Python fent servir el mòdul Psycopg2.

Cap comentari:

Publica un comentari a l'entrada