Conectando Django 1.5.3 + Python 3.3 + MySQL en Windows 8. Un arreglo y listo

descargadescarga (2)descarga (3)

Hoy quiero compartir con vosotros un tema más técnico. Igual para otros es trivial pero a mi me ha supuesto media mañana centrado es este problema.

El tema es que estoy probando alternativas para realizar una aplicación web corporativa y tenía muchas ganas de ver como funcionaba Django, así que me puse manos a la obra.

El tema no es muy complicado, yo me puse como objetivo montar algo web con Django usando base de datos MySQL, para comprobar qué se puede hacer.

MySQL

Como no tenía ningún servidor disponible y mi S.O. del trabajo es Windows 8, para instalar MySQL opté una solución WAMP, en concreto la de WampServer. Se instala fácilmente y tienes PHP, MySQL, Apache y phpadmin así que todo listo.

PHP

Bueno pues igual de sencillo, lo único es que cuando vas a la página de Django te aconseja instalar la versión 2.7 aunque también soporta experimentalmente 3.3. En Python, también considera ambas versiones como estables. Como quería probar algo que haré en el futuro, me decidí sin pensarlo por la versión 3.3, seguramente será la versión oficial en no mucho tiempo.

Django

Y por fin me instalo Django y empiezo el tutorial. Sorpresa, en caso de no utilizar SQLite, tienes que establecer un conector para la bases de datos, y aquí empieza lo complicado, no hay conector definido que vincule PHP 3.3 con Django y con MySQL. Hay algunos intentos como:

  • MySQL for Phyton: No soporta Python 3.3.
  • MySQL for Phyton-3: que no es fácil instalarlo en Windows (hay que instalar CygWin, etc) además no hay documentación y otro problema es que el proyecto parece muerto, hace dos años que no hay cambios.
  • connector-django-mysql: hace tres años que no cambia y además con versiones antiguas de Django

Nada, no conseguía conectar Django con MySQL. Buscando, encontré este interesante hilo sobre el mismo tema, aunque encuadrado en la próxima versión de Django. En ese hilo se plantean distintas alternativas y se concluye que el más adecuado es un plugin oficial desarrollado por MySQL, dentro de python 3 (https://pypi.python.org/pypi/mysql-connector-python/1.0.9)  o dentro de MySQL http://dev.mysql.com/doc/connector-python/en/index.html.

De forma totalmente fortuita, resulta que la versión 1.1.1 del conector, tiene un backend para Django!. Es importante saber que la versión estable del conector es la 1.0.12 y que la que tiene el porting de Django es la 1.1.1  (pestaña development release). Digo que he tenido mucha suerte porque la versión 1.1.1 que tiene el porting de Django fue puesta para probar ayer! como su desarrollador Geert Vanderkelen comunicaba en su blog.

Bueno, todo resuelto, pero no. Cuando me disponía a probar mi conector recién sacado del horno, resulta que no funcionaba, al lanzar

python manage.py syncdb

Me devolvía el error:

AttributeError: 'str' object has no attribute 'decode'

Primero hice lo más sencillo y vago: comentario al desarrollador, “pasa esto y no me funciona ¿qué puede ser?¿qué puedo hacer?”. Pero reconozco que no tengo paciencia, ¡era sólo un error! y el mensaje parecía bastante explicativo. Así que abrí los archivos de código fuente en el sublime y me puse a buscar dónde estaría ese decode que no me dejaba continuar.
Encontré el problema y la solución de forma lateral en este hilo. Así que elimino la función decode y pruebo. Voilá! todo va como la seda.

Ya lo tengo todo, Django + Django backend + pequeño fix + (mysql-connector-python) + Python 3.3 + MySQL.

Como no tengo mucha idea de Python, le he mandado el fix al autor del conector para confirmar que no había destruido nada y parece que es correcto (comentarios al final).

Espero que si te has visto en el mismo caso que yo, mi experiencia te pueda ayudar.  Y también espero haberme explicado bien.

Hay días que mola mucho ser desarrollador de software.

Anuncios

6 comentarios en “Conectando Django 1.5.3 + Python 3.3 + MySQL en Windows 8. Un arreglo y listo

  1. Ante todo quiero darte las gracias por molestarte en escribir este artículo, que me ha servido para decidirme finalmente a instalar Django sobre Python 3.3 ya que en mi primera aventura hace 6 meses tuve que desistir y hacerlo en Python 2.7 dada la incomprensible mala situación de los conectores MySQL del momento.
    Para seguir con las casualidades que comentas en tu artículo, te añado un par de nuevas:
    – Yo estoy trabajando en Linux, pero creo que los problemas que relato son independientes de la plataforma.
    – Desde el 6 de noviembre o así ha salido la versión de Django 1.6 y la versión dev actual del conector de MySQL es la 1.1.13.
    – El fix que tuviste que introducir ya no es necesario, supongo que lo habrán introducido en las revisiones del conector, por lo que con Django 1.5 y Python 3.3 funciona a las mil maravillas.
    – SIN EMBARGO, me he encontrado que al intentar montar Django 1.6 al hacer el syncdb da un error tan feo como este: “TypeError: sql_for_inline_foreign_key_references() takes 4 positional arguments but 5 were given”
    – SOLUCIÓN: Dicha función del conector se encuentra en el archivo: “site-packages/mysql/connector/django/creation.py” y siempre devuelve True, por lo que es seguro editarla por ” def sql_for_inline_foreign_key_references(self, model, field, known_models, style):”

    Espero que sirva a alguien de ayuda y para que aumente la cantidad de usuarios que pasan a Python 3!! Y de paso evitar algún que otro suicidio…
    Un saludo!

    • Muchas gracias por aportar Pablo, ojalá a más gente le sirva tu solución.
      Hablé con el desarrollador del plugin de MySQL cuando localicé el problema y abrí un ticket en el conector para que lo arreglasen, si no recuerdo mal, tardó un par de días en arreglarlo y subirlo, así que muy buena atención y muy agradable, da gusto.

  2. Hoy (principios 2014) la opcion mas simple es….

    # Para instalar el conector de MySQL–Python3 para Windows 7/8 64 bits:
    # bajar “Visual Studio C++ 2008 Express Edition”
    # ejecutar “C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\Tools\vsvars64.bat”
    # mas en http://stackoverflow.com/questions/2817869/error-unable-to-find-vcvarsall-bat
    # pip install -U PyMySQL3

    y ya…

    import pymysql

    connection = pymysql.connect(user=’root’, passwd=”, db=’blabla’)
    cursor = connection.cursor()

    • Oye amigo, es en serio? Eso y ya? Asi funciona completamente en conjunto con Django?
      La verdad yo ejecute la instalacion de MySQL para Python3, tal cual los enlaces que nuestro amigo puso, pero no supe si lo instalo donde debiaìa, puesto que estoy usando maquinas virtuales, mejor dicho, virtualenv para mi proyecto. Es vital para mi poder conectar Django con MySQL, y me confundi bastante con todos esos enlaces, pero segun tù con esos comandos basta, verdad?

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s