bibigeek.com  Tu blog de Programación Geek: Java, php, J2EE... y mucho más

Archive for the ‘ MySQL ’ Category

Hola a tod@s de nuevo,

Al fiiinnnnn, por dos razones importantes:

  • Una, porque hacia tiempo que no escribía (y mirad que tengo temas, pero también mucho trabajo…)
  • Y dos… ya he podido configurar Django con MySQL. Se me resistía, una y otra vez, todo porque me faltaba instalar python-mysqldb, de lo contario siempre me daba errores.

Voy a dividir la instalación en puntos para que se pueda leer, comprender y que el seguimiento sea lo más simple posible. Empecemos.

Requisitos necesarios para instalar Django con MySQL

  • Sistema Operativo Linux (testeado en Ubuntu Karmic Koala), para los Maqueros como en mi caso tendremos que esperar a que pueda hacer pruebas :P
  • Versión de Django 1.1.1  instalado (esper que con versiones anteriores o posteriores no tiene porque ser diferente)
  • Motor de Base de Datos MySQL (versión, yo tengo la 5.1.37) tanto el servidor como el cliente.
  • (Opcional) Instalación de MySQL Administrator y MySQL Query Browser
  • Paquete python-mysqldb (pero se explicará con más detalle)

Instalación MySQL Administrator y MySQL Query Browser

1- Primero buscamos el paquete mysql-admin con el siguiente comando:


sudo aptitude search mysql-admin

2- La salida que obtenemos es:


bibigeek@macbookpro-bibigeek:~/PythonProjects$ sudo aptitude search mysql-admin
pB  mysql-admin               - Herramienta gráfica para una administración sencilla de MySQL

3- Ahora ya ponemos a instalar el paquete mysql-admin con el comando:


sudo aptitude install mysql-admin

4- La salida de la instalación es (importante fijaros en el texto en negrita y subrayado):


Leyendo lista de paquetes... Hecho
Creando árbol de dependencias
Leyendo la información de estado... Hecho
Leyendo la información de estado extendido
Inicializando el estado de los paquetes... Hecho
Se instalarán los siguiente paquetes NUEVOS:
libgnomecups1.0-1{a} libgnomeprint2.2-0{a} libgnomeprint2.2-data{a} libgnomeprintui2.2-0{a} libgnomeprintui2.2-common{a}
libgtkhtml3.8-15{a} libmysqlclient15off{a} mysql-admin mysql-gui-tools-common{a} mysql-query-browser{a} 
0 paquetes actualizados, 10 nuevos instalados, 0 para eliminar y 0 sin actualizar.
Necesito descargar 0B/6212kB de archivos. Después de desempaquetar se usarán 22,3MB.
¿Quiere continuar? [Y/n/?] y
Escribiendo información de estado extendido... Hecho

Seleccionando el paquete libgnomecups1.0-1 previamente no seleccionado.

...

Configurando mysql-gui-tools-common (5.0r12-1ubuntu2) ...
Configurando mysql-admin (5.0r12-1ubuntu2) ...

Configurando mysql-query-browser (5.0r12-1ubuntu2) ...

Procesando disparadores para libc-bin ...
ldconfig deferred processing now taking place
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias
Leyendo la información de estado... Hecho
Leyendo la información de estado extendido
Inicializando el estado de los paquetes... Hecho
Escribiendo información de estado extendido... Hecho

5- Pantallazo de donde podemos encontrar los programas instalados:

Creación del Proyecto testProject

1- Ahora creamos el proyecto Django, un proyecto de prueba. Lo denominaré “testProject”, ejecutamos el siguiente comando:


django-admin.py startproject testProject

2- Configuraremos el proyecto Django para que funcione con el motor de BD MySQL. Alerta, estoy suponiendo que el usuario test y la Base de Datos testDB está creado. Os adjunto los valores a modificar en el fichero settings.py y también adjunto un pantallazo:


12 DATABASE_ENGINE = 'mysql'
13 DATABASE_NAME = 'testDB'
14 DATABASE_OPTIONS ={"init_command":"SET storage_engine=INNODB"}
15 DATABASE_USER = 'test'
16 DATABASE_PASSWORD = 'test'
17 DATABASE_HOST = 'localhost'
18 DATABASE_PORT = '3306'


IMPORTANTE: fijaos que he puesto una opción que no viene por defecto el fichero settings.py, que es el DATABASE_OPTIONS. Esta opción es utilizada para especificarle a Django que las tablas que tienen que crear en MySQL son de la tecnología INNODB.

3- Ahora ejecutamos el comando “syncdb” para crear la estructura de Base de Datos para Django. Veréis por los siguiente pantallazos y textos expuestos, que no funciona y nos mostrara un error. Veamosló todo:


bibigeek@macbookpro-bibigeek:~/PythonProjects/testProject$ python manage.py syncdb
Traceback (most recent call last):
File "manage.py", line 11, in <module>
execute_manager(settings)
File "/usr/local/lib/python2.6/dist-packages/django/core/management/__init__.py", line 362, in execute_manager
utility.execute()
File "/usr/local/lib/python2.6/dist-packages/django/core/management/__init__.py", line 303, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/usr/local/lib/python2.6/dist-packages/django/core/management/base.py", line 195, in run_from_argv
self.execute(*args, **options.__dict__)
File "/usr/local/lib/python2.6/dist-packages/django/core/management/base.py", line 221, in execute
self.validate()
File "/usr/local/lib/python2.6/dist-packages/django/core/management/base.py", line 249, in validate
num_errors = get_validation_errors(s, app)
File "/usr/local/lib/python2.6/dist-packages/django/core/management/validation.py", line 22, in get_validation_errors
from django.db import models, connection
File "/usr/local/lib/python2.6/dist-packages/django/db/__init__.py", line 41, in <module>
backend = load_backend(settings.DATABASE_ENGINE)
File "/usr/local/lib/python2.6/dist-packages/django/db/__init__.py", line 17, in load_backend
return import_module('.base', 'django.db.backends.%s' % backend_name)
File "/usr/local/lib/python2.6/dist-packages/django/utils/importlib.py", line 35, in import_module
__import__(name)
File "/usr/local/lib/python2.6/dist-packages/django/db/backends/mysql/base.py", line 13, in <module>
raise ImproperlyConfigured("Error loading MySQLdb module: %s" % e)
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module: No module named MySQLdb

Instalación del paquete Python-mysqldb

Como habréis notado y visto, cuando hemos ejecutado el syncdb nos ha proporcionado una serie de errores. Esto lo solucionaremos con la instalación del paquete “python-mysqldb”. Para instalarlo podemos ejecutar los siguientes comandos y os tendría que aparecer en la salida algo similar a esto:


bibigeek@macbookpro-bibigeek:~/PythonProjects/testProject$ sudo aptitude search python-mysql
[sudo] password for bibigeek:
p   python-mysqldb                       - Una interfaz Python para MySQL
p   python-mysqldb-dbg              - Una interfaz Python para MySQL (extensión de depuración)

bibigeek@macbookpro-bibigeek:~/PythonProjects/testProject$ sudo aptitude install python-mysqldb
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias
Leyendo la información de estado... Hecho
Leyendo la información de estado extendido
Inicializando el estado de los paquetes... Hecho
Se instalarán los siguiente paquetes NUEVOS:
python-mysqldb
0 paquetes actualizados, 1 nuevos instalados, 0 para eliminar y 0 sin actualizar.
Necesito descargar 0B/98,5kB de archivos. Después de desempaquetar se usarán 352kB.
Escribiendo información de estado extendido... Hecho
Seleccionando el paquete python-mysqldb previamente no seleccionado.
(Leyendo la base de datos ...  00%
153203 ficheros y directorios instalados actualmente.)
Desempaquetando python-mysqldb (de .../python-mysqldb_1.2.2-10_i386.deb) ...
Configurando python-mysqldb (1.2.2-10) ...
Procesando disparadores para python-support ...
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias
Leyendo la información de estado... Hecho
Leyendo la información de estado extendido
Inicializando el estado de los paquetes... Hecho
Escribiendo información de estado extendido... Hecho

Resultado final de Django con MySQL

1- Si en estos momentos ejecutamos el syncdb tendremos el siguiente resultado (texto y pantallazo):


bibigeek@macbookpro-bibigeek:~/PythonProjects/testProject$ python manage.py syncdb
Creating table auth_permission
Creating table auth_group
Creating table auth_user
Creating table auth_message
Creating table django_content_type
Creating table django_session
Creating table django_site

You just installed Django's auth system, which means you don't have any superusers defined.
Would you like to create one now? (yes/no): yes
Username (Leave blank to use 'bibigeek'): demo
E-mail address: bibigeek@gmail.com
Password:
Password (again):
Superuser created successfully.
Installing index for auth.Permission model
Installing index for auth.Message model

Para que podáis comprobar que esta se ha echo realidad (es que al fin lo he podido hacer funcionar…) os ajunto un pantallazo del MySQL Administrator con el diseño del schema testDB, veamosló:

Como habréis visto en la imagen, las tablas creadas son INNODB, importante :P

Espero que os haya servido de algo y suerte!!!!!

Hola de nuevo, ya vuelvo a estar con algún que otro consejo.

Copia de Seguridad o Backup con mysqldump

Estos días he tenido que hacer la copia de seguridad de mis Base de Datos de MySQL manualmente y como no… lo he tenido que hacer con el comando mysqldump (link man mysqldump).

En mi caso he tenido que hacer el backup de TODAS las Base de Datos que tengo y para ello he ejecutado el siguiente comando:


sudo mysqldump -A --password=CLAVE --user=USUARIO > backupDB_5Enero2010.sql

Se pueden utilizar varios que otras opciones, por ejemplo:

1. Copia de Seguridad – Backup con un comando más simple:


sudo mysqldump --opt > salidaBackup.sql

2. Copia de seguridad lo más rápidamente, ejectivamente de una Base de Datos concreta:


sudo mysqldump --opt --password=CLAVE --user=USUARIO BASEDATOS > salidaBackup.sql

3. Copia de seguridad de una sola tabla de una Base de Datos:


sudo mysqldump --opt --user=USUARIO --password=CLAVE BASEDATOS TABLA > salitaTabla.sql

Esto es lo que he podido probar pero se pueden hacer bastantes combinaciones posibles. Ahora veamos como podemos restaurar estas copias de seguridad desde comandos, nuevamente.

Restaurar Copias de Seguridad Backup con mysqldump

Al igual que he explicado en la parte superior, podemos hacer la restauración del fichero de distintas maneras y utilizando más o menos parámentros. Veamos los más utilizados:

1. Comando simple para restaurar un Base de Datos concreta:


sudo mysql BASEDATOS < salidaBackup.sql

2. Comando con más parámetros de todos


sudo mysql user=USUARIO --password=CLAVE BASEDATOS < salitaTabla.sql

Espero que os haya servido de algo!!!! Saludos

Hola a tod@s,

Hace unas semanas, cuando tuve que introducirme en el mundo MySQL, me quedaban constantemente dudas y preguntas. He tenido que hacer uso de San Google para que me las pudiera solucionar.
La duda surgía cada vez que tenía que crear una tabla, una campo de una tabla, la base de datos… ya que había un campo que no sabía que seleccionar, EL COTEJAMIENTO (así como lo está traduciendo MySQL, aunque en los manuales también estoy leyendo la palabra “COLACIÓN”.

Como codificación, yo siempre elegía el UTF-8, y ya está…, del cotejamiento no tenía NI IDEA. Entonces, buscando pude encontrar las diferencias que tenían los cotejamientos: utf8_unicode_ci y el utf8_general_ci,  ambos los más conocidos de UTF8.

Opinión: Desde mi punto vista el objetivo principal de los cotejamientos es el de proporcionar una codificación UTF-8, pero los objetivos que se puedan plantear, individualmente, cada cotejamiento son totalmente distintos, los cuales intentan tener en cuenta la precisión, la rapidez, la internacionalidad…

Características utf8_unicode_ci

  1. No soporta parcialmente el Algoritmo de  Colación Unicode
  2. Aunque no soporte totalmente el Algoritmo de Colación Unicode, la característica más significativa es que soporta EXPANSIONES, esto es visible o palpable: “cuando hacemos una comparación de caracteres, un carácter resulta igual a una combinación de caracteres, por ejemplo, ß’ => ’ss’

Características utf8_general_ci

  1. Es una colación heredada, la cual NO soporta EXPANSIONES.
  2. Sólo puede hacer comparaciones entre caracteres uno a uno
  3. Estas comparaciones son muy rápidas

UTF8_Unicode_ci VS UTF8_General_ci

Los tiros van por el último punto del utf8_general_ci que he expuesto, La Rapidez. Pero nos tenemos que hacer la siguiente pregunta:

¿Queremos RAPIDEZ o PRECISIÓN?

Con estos dos tipos de colaciones no podemos tener ambas a la vez, por lo tanto, nos decantaremos por una sola. Dependiendo de cual nos decantemos elegiremos la colación:

  • Rapidez = utf8_general_ci
  • Precisión = utf8_unicode_ci

Especifiquemos el POR QUÉ:
Utf8_unicode_ci, al soportar Expansiones, permite que un carácter (el ß’ en Alemán, por ejemplo) se transforme en una combinación de caracteres (el ’ss’ del ejemplo anterior). Entonces esta colación tiene en cuenta esta posibilidad a la hora de hacer una comparación entre caracteres.
En cambio, el utf8_general_ci, al no soportar EXPANSIONES la comparación de ß’ es ’s’ porque solamente mira un carácter. Esto significa que estas comparaciones son más rápidas pero ‘ligeramente’ menos correctas.

Comparaciones correctas en ambas colaciones:


Ä = A
Ö = O
Ü = U

Comparaciones incorrectas para utf8_general_ci:


ß = s

Si en nuestra Página Web, aplicación,… no tiene que haber problemas con caracteres ‘raros’, la elección es utf8_general_ci, es mucho más rápido. De lo contrario la colación debería ser utf8_unicode_ci.

Os pongo el link de donde he sacado la info: MySQL5 Reference.

Gracias a un comentario de arleyb, he comprobado puede darse el caso que en el fichero de configuración no tengáis activado el Motor de Almacenamiento InnoDB.
Yo lo he probado en dos servidores, uno gentoo y otro Ubuntu Server y he podido comparar los resultados (en el primero no funciona y en el segundo va de perlas).

Solución para activar InnoDB en MySQL

La solución es tan simple como la de comentar una línea en el fichero de configuración del MySQL, la línea es esta: “skip innodb”. Hay que comentarla con el carácter almohadilla ‘#’.
Este fichero de configuración se llama my.cnf y lo podemos encontrar en el directorio /etc/mysql/my.cnf.
Importante, después de realizar la modificación REINICIAR el MySQL.

Para aquellos que tengan un servidor compartido, supongo que os tendréis que poner en contacto con el servicio técnico para que se active esta opción. Por temas de rendimiento, a lo mejor lo tienen desactivado.

Hola de nuevo,
Vuelvo con otro POST de MySQL, ya os dije en el anterior POST que había investigado mucho :P … lo que me dejé en deciros es que me volví un poco loco y paranoico xD xD.

¿Cómo aplicar la Integridad Referencial con PHPMyAdmin? ¿Cómo crear las Foreign Key en PHPMyAdmin?

Estas dos preguntas podrían ser la misma, ya que para aplicar la Integridad Referencial se necesitan las Foreign Key, pero seguro que habrá gente que no conocerá la palabra Foreign Key y sí Integridad Referencial o viceversa. Vamos a utilizar el mismo ejemplo del anterior POST: el coche – modelo – servicio técnico. Veamos de nuevo el diagrama:

Modelo BD Post MySQL y las FKs

Pasos a realizar para añadir la Integridad Referencial con PHPMyAdmin

1. Crear una Base de Datos (el nombre el que queráis).

2. Crear todas las Tablas. Según el Modelo Relacional hay que crear 4 Tablas, de las cuales hay una es la que contiene las relaciones entre la T_COCHE y T_SERVICIO. Al crear una Tabla hay que especificar que el Motor de almacenamiento sea el InnoDB y no el que viene por defecto, el MyISAM. Como en el modelo no he especificado los campos/entidades tendremos que mirar todo el manual, lo siento.

- Creamos la Tabla T_COCHE:

Tabla T_COCHE

Contiene tres campos: MARCA la especificamos como la Primary Key, NOMBRE y DESCRIPCION. Como podréis fijaros lo que SÍ es importante es que el combo de longitud / Valores tiene una cantidad u otra, eso va según lo que vayamos necesitando. Otra cosa a tener en cuenta es el COTEJAMIENTO, hemos puesto el utf8-general-ci (dedicaré un POST para explicar la diferencia entre el cotejamiento utf8-unicode-ci y el utf8-general-ci, lo estuve buscando y me gustó como Tema para un POST, así no se me olvidan los conocimientos). Veamos el resumen después de dar de alta la Tabla:

Tabla T_COCHE

Esta última imagen se muestra el resumen, tanto del código SQL como la especificación de las entidades, los botones pertinentes para hacer las modificaciones, eliminar la entidad… También nos especifica cual es la Primary Key.

- Creamos la Tabla T_MODELO:

Tabla T_MODELO parte 1
Tabla T_MODELO PART2

Hay dos imágenes porque en una no me cabía el pantallazo :P . Aquí podéis fijaros que he creado un autonumérico (IDMODELO) que será la Primary Key. Le he especificado que no pueden ser números negativos (ocupa menos B) y como en el resto de campos, el cotejamiento es utf8-general-ci. Fijarse que nuevamente para la creación de la tabla especificamos que el Motor de Almacenamiento sea InndoDB. Igual que en la anterior Tabla, mostramos el resumen de su creación:

[More]

Hace unos días que estoy bastante liado buscando información sobre MySQL, claves foráneas (o en inglés, foreign Key) y la Inegridad Referencial…
No es que sea un experto con el MySQL pero intentaré explicar todo lo que he aprendido:

Definición de Integridad Referencial

Podemos entender como Integridad Refencial a la propiedad, aplicada en las Bases de Datos, que nos garantiza que una Entidad (fila o registro) se relaciona con otra entidad que EXISTE en la Base de Datos. Nos aseguramos en todo momento que la información no esté repetida innecesariamente, que exita tal información, relaciones mal hechas…

Definición de Claves Foráneas – Foreign Key

Una clave foránea, o foreign key, no es más que un campo (Entidad) de un tabla que hace referencia al identificador de otra Tabla.

MySQL – Integridad Referencial y las Foreign Key

En las primeras versiones de MySQL (hasta aproximadamente la versión 3.23) la Integridad Referencial no estaba disponible, y a la hora de crear la Base de Datos, esta Integridad debía ser controlada por parte de la aplicación.

A la hora de crear una Base de Datos, el motor por defecto de MySQL es el MyISAM pero a partir de la versión 3.23 (según la Wikipedia en la versión 4 de MySQL) se incorpora el motor InnoDB, que nos permitirá tener Bases de Datos con Integridad Referencial.

Tengo que decir que no sé muy bien como interpreta el motor MyISAM la sintaxis de Foreign Key (por lo que he podido entender… lo interpreta como si fueran CREATE TABLE), pero si puedo asegurar, es que la Integridad Referencial no se aplica nativamente para este motor.

¿Qué es el Motor MyISAM?

Es el motor de almacenamiento por defecto del MySQL. Como propiedades relevantes tenemos que destacar su gran rapidez con las consultas, “ya que no tiene que hacer comprobaciones de Integridad Referencial”. Está realmente optimizado para aplicaciones, sistemas, programas… en las que no hay un número elevado de inserciones.

¿Qué es el Motor InnoDB?

[More]