El libro de Django 1.0

5.1. La manera simple de hacer una consulta a la base de datos

Así como en el Capítulo 3 detallamos la manera "tonta" de producir una salida añadiendo el contenido HTML directamente dentro de la vista, hay una manera "tonta" de recuperar datos desde la base de datos en una vista. Esto es simple: sólo usa una librería de Python existente para ejecutar una consulta SQL y haz algo con los resultados.

En este ejemplo de vista, usamos la librería MySQLdb (disponible en http://www.djangoproject.com/r/python-mysql/) para conectarnos a una base de datos de MySQL, recuperar algunos registros, y alimentar con ellos una plantilla para mostrar una página web:

from django.shortcuts import render_to_response
import MySQLdb

def book_list(request):
    db = MySQLdb.connect(user='me', db='mydb', passwd='secret', host='localhost')
    cursor = db.cursor()
    cursor.execute('SELECT name FROM books ORDER BY name')
    names = [row[0] for row in cursor.fetchall()]
    db.close()
    return render_to_response('book_list.html', {'names': names})

Aunque esta forma de trabajar funciona bien, sufre de algunos problemas importantes:

  • Los parámetros de la conexión a la base de datos se están indicando directamente dentro del código. Lo ideal sería que esos parámetros se guardasen en la configuración de Django.
  • Tenemos que escribir el mismo código una y otra vez: crear una conexión, un cursor, ejecutar una sentencia, y cerrar la conexión. Lo ideal sería que todo lo que tuviéramos que hacer fuera especificar los resultados que queremos.
  • Nos ata a MySQL. Si, en el camino, cambiamos de MySQL a PostgreSQL, tenemos que usar un adaptador de base de datos diferente (por ej. psycopg en vez de MySQLdb), alterar los parámetros de conexión y — dependiendo de la naturaleza de las sentencia de SQL — posiblemente reescribir el SQL. La idea es que el servidor de base de datos que usemos esté abstraído, entonces el pasarnos a otro servidor podría significar realizar un cambio en un único lugar.

Como esperabas, la capa de la base de datos de Django apunta a resolver estos problemas. Este es un adelanto de cómo la vista anterior puede ser reescrita usando la API de Django:

from django.shortcuts import render_to_response
from mysite.books.models import Book

def book_list(request):
    books = Book.objects.order_by('name')
    return render_to_response('book_list.html', {'books': books})

Explicaremos este código enseguida en este capítulo. Por ahora, tengamos sólo una idea de cómo es.