miércoles, 27 de octubre de 2010

Nota Django: sobreescribiendo métodos

http://docs.djangoproject.com/en/dev/topics/db/models/#overriding-predefined-model-methods

En el ejemplo siguiente se muestra como sobreescribir el método save() de un modelo. Lo importante es poder añadir más código al función pero sin perder la funcionalidad primitiva.


class Model(models.Model):
pass

def save(self, *args, **kwargs):
#add some functionality
super(Model, self).save(*args, **kwargs) # Call the "real" save() method.
#add some functionality

martes, 21 de septiembre de 2010

Nota python: Eliminar elementos repetidos de una lista

Necesitaba eliminar elementos repetidos de una lista, la primera aproximación sería recorrer la lista e ir comprobando si los elementos están repetidos. Decidí buscar otras opciones y he encontrado dos formas de eliminar elementos repetidos de una lista. Ninguno de estas dos formas respeta el orden inicial de la lista.

Uso del tipo de dato set (conjunto de datos mutable, sin orden, que no contiene duplicados). Convertimos primero la lista a tipo set y luego volvemos a convertir el tipo set en lista.

>>>lst = [1, 1, 3, 2]
>>> lst
[1, 1, 3, 2]
>>> lst = list(set(lst))
>>> lst
[1, 2, 3]

En el siguiente ejemplo hacemos uso de los diccionarios para eliminar los elementos repetidos. Primero creamos un diccionrio donde las claves están almacenadas en la lista. Depués obtenemos las claves del diccionario que acabamos de crear.

>>> lst = [1, 1, 3, 2]
>>> lst
[1, 1, 3, 2]
>>> lst = dict.fromkeys(lst)
>>> lst
{1: None, 2: None, 3: None}
>>> lst = lst.keys()
>>> lst
[1, 2, 3]

jueves, 9 de septiembre de 2010

Nota: Trabajando con listas en Python. Igualar listas.

Estaba depurando un programa y me he dado cuenta de como funcionan las listas en python al igualarse.
Si se iguala una lista a otra, no se está creando una nueva lista con los valores de la anterior, si no que estás creando un nuevo nombre para la misma lista.

Voy a poner un ejemplo donde se ve claramente:

l1 = []
l1.append('1')
l1.append('2')
l2 = l1
l2.append('3')
print l1
>> ['1', '2', '3']

martes, 24 de agosto de 2010

Django: hosting gratuito

Desde www.alwaysdata.com nos ofrecen la posibilidad de crearnos una cuenta gratuita que nos ofrece servicio de hosting para nuestros proyectos en django.
La página de registro está en francés pero una vez dado de alta como usuario, el panel de administración está en español.

Todavía no he podido configurar el servidor para hacer alguna prueba pero parece que tiene buena pinta. Tenía ganas de encontrar un servicio de hosting gratuito para django.

En cuanto haya subido algo al servidor, ya os comentaré.

http://www.alwaysdata.com

PD: Si alguien lo prueba, no estaría mal que lo compartiese en la zona de comentarios.

lunes, 23 de agosto de 2010

Django: Restaurar una tabla borrada a mano de una aplicación gestionada con South

Estaba haciendo unas pruebas con la base de datos y necesitaba limpiar una tabla, por error, en vez de borrar el contenido, eliminé la tabla de la base de datos.

Si se intenta migrar la aplicación, South no restaura la tabla, ya que no se comprueba si las tablas están creadas en la base de datos. Si por el contrario, al ejecutar el comando "python manage.py syncdb", tampoco crea la tabla ya que detecta la tabla está gestionada por south. Para poder generar la tabla, se hace con el comando syncdb, pero además hay que incluir el parámetro -all.
python manage.py syncdb -all

Gestor de paquetes easy_insatall

wikipedia:

EasyInstall es un gestor de paquetes para el lenguaje de programación Python que suministra un formato estándar para distribuir programas y librerías en Python, basado en el envoltorio llamado huevos de Python (Python eggs).

Para poder usar easy_isntall, es necesario instalar python-supertools.
apt-get install python-setuptools

Una vez que ya tenemos instalado python-supertools, ya se pueden instalar los "eggs" con easy_install.

Ejemplo de instalación:
easy_install PackageName


Ejemplo de desinstalación:

easy_install -m PackageName



Nota:
Es muy interesante el uso de easy_install con virtualenv. A ver si hago un pequeño post sobre el uso de virtualenvs.

Borrar el historial de South.

Para reiniciar completamente el historial de South hay que hacer lo siguiente:
python manage.py migrate appname --fake zero

Este comando borra todo el historial de South.

A continuación se tienen que borrar los ficheros.
rm appname/migrations/*

En este momento ya tenemos el historial de South completamente limpio por lo que es necesario crear las nuevas migraciones:
python manage.py schemamigration appname --initial
python manage.py migrate appname

Si solamente queremos borrar el historial hasta un lugar concreto, hay que hacer lo siguiente:
python manage.py migrate appname --fake MIGRATION_NUMBER

El atributo --fake, indica que solamente se borran las migraciones de la base de datos, no afecta a lo que contiene la base de datos, es decir, no se aplican los cambios.

A continuación hay que borrar todos los archivos posteriores a la migración desde la que queremos partir que se encuentran en :
appname/migrations

A continuación creamos una nueva migración para guardar los cambios que hay en la base de datos. Al haber hecho "python manage.py migrate appname --fake MIGRATION_NUMBER", simplemente se han borrado las migraciones de la base de datos pero no se han aplicado los cambios, ahora lo que nos indica South y lo que hay en la base de datos es diferente por lo que es necesario hacer una nueva migración:
python manage.py schemamigration appname --auto

El siguiente paso que debemos hacer, es aplicar la migración:
python manage.py migrate appname

miércoles, 21 de abril de 2010

SQLite en Python.

Una herramienta muy útil para trabajar con SQLite  es la extensión de firefox "sqlitemanager".

Hay una gran cantidad de bases de datos, tanto de pago como gratuitas. También existen una gran variedad de módulos distintos para trabajar con esas bases de datos en Python, lo que implica que hay una gran cantidad de APIs que aprender.

Se ha desarrollado una propuesta de API estándar para el manejo de bases de datos en Python para que el código sea prácticamente igual para todas las bases de datos. Esta API es Python Database API (DB-API)

http://www.python.org/dev/peps/pep-0249/

Hay un módulo que se ajusta a la DB-API 2.0 para SQLite. Dicho módulo es:
slqlite3

Para realizar la conexión con la base de datos se hace con la función "connect" esta función tiene unos parámetros de entrada que no están estandarizados. Para el módulo sqlite3 el parámetro de entrada es la ruta donde se encuentra almacenado el archivo que contiene los datos. También se puede poner la cadena ":memory:" lo que implicará que se usará la memoria RAM para la base de datos, por lo tanto no se almacenarán datos al terminar la ejecución del programa.

import sqlite3
bdd = sqlite3.connect("./db.sqlite")

Para poder realizar operaciones, se han de realizar sobre un cursor.

cur=bdd.cursor()

Si en nuestra base de datos está desactivado la opción de autocommit, será necesario hacer un commit:

bdd.commit()


Ejemplo:

#!/usr/bin/python
import sqlite3

#connect to the data base
bdd = sqlite3.connect("./db.sqlite")

#cursor
cur=bdd.cursor()

#create a table
cur.execute("""CREATE  TABLE "main"."data" 
("id" INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL , 
"name" VARCHAR)""")

#insert a value
name="Nombre"
sql_script="INSERT INTO data ( name ) VALUES (\'%s\')" % name
cur.execute(sql_script)
bdd.commit()


#close the data base 
bdd.close()


Nota: Si se va a ejecutar este ejemplo por segunda vez, no debe existir el fichero "db.sqlite" en el mismo directorio, ya que va a intentar crear otra vez la tabla "data" y dará error.


Post relacionados:
http://blog.pablovieytes.com/2010/04/base-de-datos-sqlite-y-gestor-manager.html

Bibloigrafía:

Base de datos sqlite y gestor "sqlite manager".

SQLite es un sistema de gestión de bases de datos relacional que está contenida en una relativamente pequeña biblioteca en C.

El motor de SQLite no es un proceso independiente con el que el programa principal se comunica, si no que pasa a ser parte del programa principal que lo gestiona.

El conjunto de la base de datos (definiciones, tablas, índices, y los propios datos), es guardada en un único  fichero estándar en la máquina host. Este diseño simple se logra bloqueando todo el fichero de base de datos al principio de cada transacción.


Sqlite manager es una extensión para firefox que permite manegar bases de datos sqlite. Esta extensión permite, crear nuevas tablas, visualizar el contenido de tablas existentes, modificar dicho contenido, o bien añadir nuevos registros a la base de datos.

Extensión:
https://addons.mozilla.org/es-ES/firefox/addon/5817


Algunos pantallazos de sqlitemanager.


Ejemplo de base de datos en sqlitemanager:

Interfaz para la creación de una nueva tabla:



Registros de una tabla existente: