Acceso a
Bases de Datos desde Python
Por Vladimir Eritok
database.zip
Mucha gente usa Python debido a que como otros
lenguajes de script, es portable, independiente de la plataforma y usa un
lenguaje de propósito general que puede realizar todo tipo de tareas, incluso
las que hacen referencias a Bases de Datos.
Python te permite escribir programas que accedan, muestren y actualicen
la información en la Base de Datos con un esfuerzo mínimo
Para
realizar esto, se creo en Python un API para accesos a bases de datos que
actualmente se encuentra en su versión 2.0
Lo primero
que uno tiene que hacer es conseguirse la librería que te va a permitir
trabajar con tu Base de Datos preferida. Si escoges SQLite, MySQL, PostgreSQL o Interbase/Firebird la forma de importar sus librerias sería:
import MySQLdb
# para o MySQL
import sqlite # para o SQLite
from pyPgSQL
import PgSQL # para
o PostgreSQL
import kinterbasdb
# para Interbase / Firebird
Una vez tenemos en memoria la librería ya
podemos empezar a trabajar comenzando con una conexión. En el caso de MySQL
sería:
con =
MySQLdb.connect('servidor', 'usuario', 'clave')
con.select_db('base de datos')
Para o Interbase / Firebird:
con = kinterbasdb.connect(dsn='servidor:/path/archivo.fdb',
user='usuario',password='clave')
A continuación el proceso es idéntico para
todos:
Cursor = con.cursor() && Se
crea el cursor
Se ejecuta una instrucción SQL
Cursor.execute(‘Select
* from clientes’)
Una vez ejecutado podemos traernos un solo
registro, unos pocos, todos o todos con sus cabeceras con los nombres de los
campos
rs = cursor.fetchone()
rs = cursor.fetchmany()rs = cursor.fetchall() # busca todas
rs = cursor.dictfetchall() # Quizas Firebird no soporta esta opción
El resultado lo tienes
con :
Print (rs[0])
Para llamar a un
procedimiento almacenado se debería usar:
cur.callproc("the_proc", (input1, input2))
Como creo que un ejemplo
completo es más rico, aquí tienes todo el código que te permite mostrar el
contenido de una tabla en tu aplicación. Para este caso se ha usado wxPython
para poder crear las pantallas. Para la Base de Datos se ha usado Firebird y el
driver correspondiente te lo puedes bajar de http://kinterbasdb.sourceforge.net/
from
wxPython.wx import *
import
fixedpoint
import
kinterbasdb
kinterbasdb.init(type_conv=100)
class
MyFrame(wxFrame):
def __init__(self, *args, **kwds):
kwds["style"] = wxDEFAULT_FRAME_STYLE
wxFrame.__init__(self, *args, **kwds)
self.list_ctrl_1 = wxListCtrl(self,
-1,style=wxLC_REPORT|wxSUNKEN_BORDER)
self.__set_properties()
self.__do_layout()
con =kinterbasdb.connect(dsn='c:\\base1.gdb',user='SYSDBA',
password='masterkey')
cur=con.cursor()
sel="select * from t4"
cur.execute(sel)
self.list_ctrl_1.InsertColumn(0, 'Id')
self.list_ctrl_1.InsertColumn(1,
'Fl1')
self.list_ctrl_1.InsertColumn(2,
'Fl2')
self.list_ctrl_1.SetColumnWidth(0, 50)
self.list_ctrl_1.SetColumnWidth(1, 50)
self.list_ctrl_1.SetColumnWidth(2,
100)
self.list_ctrl_1.DeleteAllItems()
n=0
for rec in cur.fetchall():
self.list_ctrl_1.InsertStringItem(n, str(rec[0]))
self.list_ctrl_1.SetStringItem(n,
1, str(rec[1]))
self.list_ctrl_1.SetStringItem(n,
2, str(rec[2]))
n+=1
def __set_properties(self):
self.SetTitle("frame_1")
self.SetSize((400, 300))
def __do_layout(self):
sizer_1 = wxBoxSizer(wxVERTICAL)
sizer_1.Add(self.list_ctrl_1, 1,
wxEXPAND, 0)
self.SetAutoLayout(1)
self.SetSizer(sizer_1)
self.Layout()
class
MyApp(wxApp):
def OnInit(self):
frame = MyFrame(NULL, -1, '')
frame.Show(true)
return true
app=MyApp(0)
app.MainLoop()
Y esto
sería lo que se vería:

Sólo algún pequeño comentario. Antes de Python 2.3, la
librería estándar de Python contenía solamente rudimentarios date/time, por esa
razón mx.DateTime llegó a ser muy popular. De hecho el, mx.DateTime se
recomendaba por las especificaciones del Python DB API 2.0, así la mayoría de
los módulos de DB API modules (incluyendo kinterbasdb) representan SQL DATE, TIME, y TIMESTAMP como objetos
mx.DateTime por defecto. Esta dependencia se documenta aquí:
http://kinterbasdb.sourceforge.net/dist_docs/installation-binary.html#dependency_list
kinterbasdb 3.1 introdujo una opción llamada Dynamic Type Translation (DTT),
que permite al programador de Python establecer una serie de conversiones para
tipos de datos específicos. Si no se tiene mucho código dependiente del
mx.DateTime, lo mejor es usar el módulo datetime del Python 2.3. La forma más
fácil de hacerlo es escribiendo la siguiente instrucción justo depues del
'import kinterbasdb':
kinterbasdb.init(type_conv=100)
Pero esto tiene un pequeño
problema y es que el 'type_conv=100' depende de otro módulo llamado
'fixedpoint' que te lo puedes bajar de (http://fixedpoint.sourceforge.net
) y que por eso está puesto entre las primeras líneas de código..

FoxPress – Julio - Agosto de
2004