Category Archives: python

Módulo mysql-python

Para interactuar con MySQL y Python, necesitaremos el modulo mysql-python (previa instalación)

Pequeñas anotaciones para trabajar con él:

Código básico para una consulta:

## importamos el módulo de mysql
import MySQLdb
 
servidor = "localhost"
usuario = "user"
clave = "password"
bd = "db"
 
### Creamos la conexión a la base de datos 
### Devuelve un objeto connetion
 
con = MySQLdb.connect(servidor, usuario, clave)
con.select_db(bd)
 
### Creamos un cursos por cada operación que queremos realizar
### sobre la base de datos. Es importante cerrarlos una vez utilizados.
 
cursor = con.cursor()
 
## Consulta a ejecutar
sql="SELECT * from table"
 
## Ejecutamos la consulta
cursor.execute(sql)
 
## Consultamos los datos obtenidos en forma de tuplas
## accedemos a ellos por índices numéricos
 
rows = cursor.fetchall()
for x in rows:
    print "%d, %s" % (x[0],x[1])
 
## Cerramos el cursos y la conexión
cursor.close()  
con.close()

Una vez que obtenemos resultados a través del cursor, podemos trabajar con los resultados a través de: fetchone, fetchmany o fetchall o usar el objeto Cursor como un iterador.

En el caso de que queramos obtener los datos devueltos por la consulta sql en forma de diccionario, a la hora de realizar la conexión incluir el parámetro MySQLdb.cursors.DictCursor

cursor = con.cursor(MySQLdb.cursors.DictCursor)

Solución a los problemas de codificación de bases de datos y a la hora de mostrarlo:

con.set_character_set('utf8')  ## conecctor
cursor.execute('SET NAMES utf8;')
cursor.execute('SET CHARACTER SET utf8;')
cursor.execute('SET character_set_connection=utf8;')

Enlaces:

En importante acostumbrarse a ejecutar el metodo commit cuando queremos que los cambios introducidos se hagan efectivos a nivel de base de datos:

con.commit()

Acentos en Python

Acentos en el código de Python

# -*- coding: utf-8 -*-

Máquina virtual automatizada para programar con python y Django

A continuación indico unas anotaciones para montar una pequeña infraestructura para usar Django.

Para empezar a usar Python y Django, podemos instalarlo en el sistema (a través de apt-get o pip/easy_install), usarlo a través de entornos virtuales (virtualenv), etc Pero vamos a ir un poco más allá de los sistemas, y vamos a montarnos un entorno de desarrollo virtual.

No voy a ponerme a instalar un Ubuntu paso a paso. ¿qué pereza, no? Vamos a usar para ello: Vagrant junto con Chef

La idea general, es crear una maquina virtual con nuestras necesidades: en este caso: Python y Djando lista para ser usada. Para esta tarea, haremos uso de Vagrant y Chef-solo que nos permitirán, a través de un fichero la configuración, la configuración específica del sistema, y automágicamente se creará el sistema, ésta y todas las veces que quedamos.

Por dónde empezamos:

  • Instalamos Vagrant en nuestro sistema
  • Creamos una carpeta donde almacenar nuestras maquinas (En un alarde de originalidad, le he llamado «vagrant») y posteriormente, una carpeta por maquina. En este caso, «djangoguide»
  • Dentro del directorio «vagrant/djangoguide» “inicializamos” el directorio de Vagrant con un:
    vagrant init

    y se crea un directorio con el fichero Vagrantfile que será donde se indica la configuración de la máquina virtual a crear. Procedemos a realizar algunas modificaciones del fichero VagrantFile acorde a nuestras necesidades:

  • [Fichero VagrantFile propuesto basada en la configuración estándar y la propuesta de fichero simplificado gracias a Juanje Ojeda]

    # -*- mode: ruby -*- 
    # vi: set ft=ruby :
     
    Vagrant::Config.run do |django_conf|
        # Nombre logico de la imagen a partir de la que se crea la maquina virtaul.
        django_conf.vm.box = "lucid64"
     
        # URL desde donde se descarga la imagen de la maquina virtual con el nombre
        # indicado en config.vm.box.  Solo se usa en el caso de no existir la maquina a crear.
     
        django_conf.vm.box_url = "http://files.vagrantup.com/lucid64.box"
     
        # Asignar una ip a la mv. En este caso, no es necesario los redireccionamiento
        # config.vm.network :hostonly, "10.0.33.10"
     
        # Redireccionamientos de puertos desde dentro de la maquina
        # Esto permite acceder al puerto 8000 (donde se suele lanzar django por defecto) 
        # a traves del puerto 8001 desde fuera.
     
        django_conf.vm.forward_port 8000, 8001
     
        # Lo siguiente, permite hacer el «provisionamiento» a Chef-solo
        # indicandole los cookbook que queremos que esten disponibles
        # en nuestro nueva maquina virtual
     
        django_conf.vm.provision :chef_solo do |chef|
          ## Path relativo a este fichero
            chef.cookbooks_path = "cookbooks"
            chef.add_recipe "apt"
            chef.add_recipe "build-essential"
            chef.add_recipe "vim"
            chef.add_recipe "python"
            chef.add_recipe "django"
        end 
        # Es interesante compartir código con la maquina virtual. Lo vamos a hacer
        # a traves una carpeta compartida. En este caso, mi carpeta con los repos
        # de git. En la maquina virtual, estan accesibles en /opt/git
        # Todos los cambios en esa carpeta, son visibles dentro y fuera de la vm. 
     
        django_conf.vm.share_folder "git","/opt/git","/home/anarey/git/djandoapps"
    end
  • Del fichero Vagrantfile se puede destacar:
    • Configuración correspondiente a la maquina virtual y a partir de que imagen se va a crear
    • Información sobre la redirección de puertos realizado para los posteriores servicios que se monten.
    • Configuración especifica referencia al software a instalar y configuraciones. Esto se hace a través de chef-solo y un conjunto de Cookbooks que se le indica
  • Nos descargamos los cookbooks que hemos indicados. Los cookbooks son libros de recetas, es decir, un conjunto de directorios y ficheros con instrucciones donde se indica cierto software a instalar/configurar en nuestro sistema. Como se indica, vamos a instalar después de la creación de la maquina virtual: apt, apache2 con el módulo mod_wsgi,built-essential, git, vim, django.

    Obtener los cookbooks necesarios y creamos una carpeta dentro de nuestro directorio «vagrant/djangoguide» llamado cookbooks.

    git clone git://github.com/opscode-cookbooks/apt.git
    git clone git://github.com/opscode-cookbooks/build-essential.git
    git clone git://github.com/opscode-cookbooks/python.git
    git clone git://github.com/opscode-cookbooks/vim.git

    Cuidado: El directorio «cookbooks» debe coincidir con el indicado en el directorio Vagrantfile (ruta relativa a la localización de el fichero Vagrantfile) «chef.cookbooks_path = “cookbooks”» y para cada cookbook nuevo que se quiera incluir, hay que indicarlo en el fichero Vagrantfile.

    Vamos a crear a mano, el cookbook para instalar Django. (Podríamos buscar el cookbooks correspondiente e instalarlo, pero es muy simple hacerlo) Creamos la estructura de ficheros necesaria y editamos el fichero cookbooks/django/recipes/default.rb con el siguiente contenido:

      python_pip 'django' do
          action :install
      end
  • Tenemos todo listo para crear nuestra nueva máquina virtual. Ejecutamos un
    vagrant up

    y tras unos minutos ¡Abra cadabra! Automagicamente, tenemos una maquina virtual lista para programar contra Django. ¡Y sin ver un .iso! :)

  • Comandos útiles:
    vagrant --help
    vagrant up: Levantar la instancia
    vagrant halt: Parar la instancia
    vagrant ssh: Acceder a la instancia y poder trabajar dentro de ella.
    vagrant provision: «Recargar la configuración de la maquina y cookbooks»
    vagrant destroy: Eliminar los ficheros correspondientes a la instancia creada. No borra el fichero de configuración
  • Ya podemos acceder a la máquina y tenemos todo listo para programar. Pero, un momento… ¿Cómo paso el código? Podría configurar un repositorio, pero lo más cómodo, montar una carpeta compartida entre «mi portátil» y la maquina.

    Añadimos al final del fichero VagrantFile la siguiente linea:

    django_config.vm.share_folder "git","/opt/git","/home/anarey/git/djandoapps"

    donde: /opt/git es la ruta de la maquina virtual y «/home/anarey/git/djandoapps» es la ruta origen de los ficheros (en mi portátil)

  • Ya tenemos una máquina nueva, con todo lo necesario para utilizar Django instalado.

Nota: Cuando queramos ejecutar nuestro servidor de Django de pruebas, lo hacemos así:

python manage.py runserver [::]:8000

De esta forma, para ver la pagina que estamos programados, es suficiente con abrir un navegador web y poner la url: http://localhost:8001 (Como indicamos en la redirección de puertos)

URL de referencia:

Problemas con MySQL-python

El otro día tuve problemas al instalar el modulo para poder usar MySQL a través de Python en un virtualenv a través de pip.

Así que tuve que instalarlo de forma manual.
Por lo que me descargué el paquete MySQL-python de su web, descomprimes y lo instalas:
python setup.py install

y listo para atacar a MySQL. :)

Comprobamos que está correcto:

import MySQLdb

Si no muestra un error, es que es correcto.

Anotaciones rápidas para configurar vim para Python

A continuación, en modo rápido, que hay que hacer para configurar VIM para programar de forma cómoda en Python.

Crear el fichero (en caso de no existir) ~/.vimrc y añadir el siguiente contenido:

set number
syntax on
filetype indent plugin on
set modeline
set tabstop=8 expandtab shiftwidth=4 softtabstop=4
set background=dark

¿Qué conseguimos? Que salga la numeración de línea (set number), los colorines en el código que escribas (syntax on), indentación automática para escribir código en python (filetype indent plugin on, set tabstop=8 expandtab shiftwidth=4 softtabstop=4,set modeline) y para facilitar la vista del código coloreado sobre pantalla negra (set background=dark).

Pues ahí lo dejo, para cuando lo vuelva a necesitar o le sea útil a alguien.

Más detalle sobre como configurar VIM para programar en Python