FoxPress – Julio-Agosto 2004

 

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