¿Por qué prefiero Vagrant sobre Wamp Server?

Hoy he publicado en el blog de Urlan Heat un artículo contando por qué prefiero usar Vagrant para crear mis entornos de desarrollo en lugar de usar Wamp o tener un servidor Apache y MySQL instalado en mi ordenador.

Si no has probado Vagrant te recomiendo que le eches un vistazo.

¿Por qué es mejor usar Vagrant que Wamp o similares?

Servidor Web + PHP + MySQL + PHPMyAdmin en Android

Hoy he encontrado una joyita que quiero compartir con vosotros. Si le tenéis tanta aversión a Java como yo (¿por qué? … manías) tengo una buena noticia. Podéis desarrollar aplicaciones web para Android que funcionan sin conexión a Internet gracias a KSWEB, un servidor web que incluye PHP y MySQL.

Lo estoy probando y, por ahora, me está sorprendiendo gratamente. Se puede instalar gratis pero la licencia expira en cinco días. Cuesta unos tres euros pero si cumple lo que promete los vale. Os mantendré informados.

 KSWeb - Servidor web + PHP + MySQL en Android

Enlace a la web del autor: http://kslabs.ru/

MySQL – Comprobar si una fecha determinada es hoy

Hoy le he estado dando vueltas a una consulta de MySQL para sacar todos los registros que se han creado en el día. Se me ha ocurrido algo como:

SELECT * FROM tabla WHERE fecha = TODAY()

Pero no, esto no funciona. He buscado en la web y me he encontrado la solución. Una solución muy sencilla sin romperse la cabeza:

SELECT * FROM tabla WHERE  DATE(fecha) = DATE(NOW())

La función DATE() nos devuelve la fecha eliminando la parte de la hora. La función NOW() nos da la fecha y hora de hoy. Con la función DATE() eliminamos la parte de la hora y ¡voilá! tenemos una sencilla forma de comprobar si las fechas son iguales.

Idea sacada de aquí.

MySQL: actualizar un campo con la suma de unos registros de otra tabla

Si tenemos una tabla que queremos actualizar con la suma de valores de otra tabla podemos hacerlo vía programación (lo he visto en un programa que he tenido que modificar recientemente) o lo podemos hacer directamente usando una consulta MySQL.

En este ejemplo en concreto que me encontré había dos tablas:

facturas:

  • num_factura
  • base_imponible

factura_detalle:

  • num_factura
  • articulo
  • precio

La tabla factura_detalle contiene, como el nombre indica, el detalle de las facturas. Cada línea es un artículo y su precio.

La tabla facturas tenía un campo base_imponible que era necesario actualizar con el precio de los artículos de la factura en la tabla factura_detalle.

Esto se puede hacer directamente usando una subconsulta:

UPDATE facturas SET base_imponible =
     ( SELECT sum( precio ) total_calculado
		FROM factura_detalle
		WHERE num_factura = '30')
     WHERE num_factura = '30';

La subconsulta se encarga de buscar todos los registros de la tabla de detalle y sumar los precios:

SELECT sum( precio ) total_calculado
		FROM factura_detalle
		WHERE num_factura = '30')

y la consulta principal lo que hace es asignar ese valor, que sería algo así suponiendo que la anterior hubiese devuelto el valor ‘300’:

UPDATE facturas SET base_imponible = '300'
     WHERE num_factura = '30';

MySQL: Importar un fichero SQL cambiando el charset

En ocasiones es posible que necesites importar a una base de datos MySQL un fichero con un backup que está definido con un set de caracteres diferente al que usa la BD.

Si se importa sin más es muy posible que aparezcan caracteres extraños al ver el contenido de la base de datos.

Desde consola

Cuando esto sucede puedes indicar una condición extra en la importación para indicar el character set que vas a usar. Esta opción es: –default-character-set:

mysql -uusuario -p base_datos < fichero.sql --default-character-set=set_caracteres

Donde:
set_caracteres: es el set de caracteres de la nueva base de datos (por ejemplo utf8).
fichero.sql: es el fichero que contiene la estructura y/o datos del fichero exportado previamente.
base_datos: es la base de datos en la que vamos a guardar el contenido del fichero.

Con PHPMyAdmin

Esto también se puede hacer desde PHPMyAdmin. En la pestaña de importación de datos hay un desplegable que nos permite indicar el charset que vamos a usar.

Problemas al crear una función en MySQL: Error 1064

Hace un par de días publiqué una función en MySQL que permitía contar los días entre dos fechas sin contar fines de semana. Le he usado en varios servidores pero en uno de ellos me he encontrado con un problema:

#1064 - You have an error in your SQL syntax; check the manual 
that corresponds to your MySQL server version for the right syntax 
to use near 'IF EXISTS `workdaydiff`' at line 1 

Después de volverme loco un buen rato he encontrado la solución aquí:

Bastaba con añadir un punto y coma al delimitador, es decir, en lugar de:

DELIMITER $$

usar:

DELIMITER $$;

y, efectivamente, ha funcionado.

Función en MySQL para contar días entre dos fechas sin contar sábados ni domingos

Después de darle muchas vueltas he encontrado esta útil función en los foros de MySQL que permite calcular el número de días que han transcurrido entre dos fechas sin contar fines de semana.

Espero que os sea tan útil como a mí.

DELIMITER $$
 
DROP FUNCTION IF EXISTS `workdaydiff`$$
CREATE FUNCTION workdaydiff(b date, a date) RETURNS int(11)
    DETERMINISTIC
    COMMENT 'working day difference for 2 dates'
BEGIN
 
DECLARE freedays int;
 
SET freedays = 0;
SET @x = DATEDIFF(b, a);
IF @x<0 THEN
SET @m = a;
SET a = b;
SET b = @m;
SET @m = -1;
ELSE
SET @m = 1;
END IF;
SET @x = abs(@x) + 1;
 
SET @w1 = WEEKDAY(a)+1;
SET @wx1 = 8-@w1;
IF @w1>5 THEN
SET @w1 = 0;
ELSE
SET @w1 = 6-@w1;
END IF;
 
SET @wx2 = WEEKDAY(b)+1;
SET @w2 = @wx2;
IF @w2>5 THEN
SET @w2 = 5;
END IF;
 
SET @weeks = (@x-@wx1-@wx2)/7;
SET @noweekends = (@weeks*5)+@w1+@w2;
 
SET @result = @noweekends-freedays;
RETURN @result*@m;
END$$
 
DELIMITER ;

Python: Trabajar con MySQL

En esta nueva entrega de artículos sobre Python le ha tocado el turno al MySQL.

Lo primero, si no tenemos instalado el soporte MySQL para Python debemos añadirlo al sistema. En Ubuntu podemos hacerlo así:

sudo apt-get install python-mysqldb

Existen dos formas de trabajar con MySQL, una es a través del módulo _mysql y la otra es a través de MySQLdb. _mysql es la implementación en Python de la API de C para MySQL. Se suele recomendar usar MySQLdb para trabajar, pero, cabezota que es uno yo suelo trabajar con _mysql :-P.

Para el ejemplo voy a suponer que existe una tabla llamada clientes que contiene los campos nombre y apellido.

#!/usr/bin/env python
 
import _mysql
 
# Datos para la conexión a MySQL
mysql_servidor = 'localhost'
mysql_usuario  = 'usuario'
mysql_clave    = 'clave'
mysql_bd       = 'base_datos'
 
conexion = _mysql.connect(host=mysql_servidor, user=mysql_usuario, passwd=mysql_clave, db=mysql_bd)
sql = "select * from clientes limit 10"
conexion.query(sql)
query = conexion.store_result()
if query.num_rows():
	print "Resultados\n=========="
	fila = query.fetch_row(how=1)
	while fila:
		print fila[0]["nombre"], " ", fila[0]["apellido"]
		fila = query.fetch_row(how=1)
conexion.close()

Aquí empezamos a usar conceptos algo más complicados como los diccionarios y las tuplas. Se recomienda buscar información al respecto (o igual me animo y escribo algún post sobre el tema).

Algunos comentarios:

1) fetch_row() tiene un parámetro opcional llamado how que indica cómo se devuelven los resultados. Si se especifica el valor ‘1’ los devolverá como un dicconario donde la clave es el nombre del campo.

2) Uso fila[0] ya que fetch_row devuelve cada fila como un diccionario dentro de una tupla.

3) store_result(). Si se usa esta función el servidor nos envía todos los datos “de golpe”, lo que puede ser un problema si hay muchos datos. Sin embargo podemos limitar el número de resultados usando LIMIT en la SQL. También podemos usar use_result() y el servidor nos devolvera las filas una a una. Esta opción tiene la pega de que consumimos más recursos del servidor.

PHP: Cambiar el set de caracteres en una consulta MySQL

Existe una función, que he de reconocer no conocía, que permite cambiar el set de caracteres (charset) cuando hacemos una consulta a MySQL.

Por ejemplo, si queremos asegurarnos que los datos que vamos a introducir en la base de datos van a estar en UTF-8 usaremos:

mysql_set_charset('utf8',$link);

(donde el parámetro $link, como en casi todas las funciones para mysql, es opcional).

Esta función se ha incorporado en la versión PHP 5 (5.0.7) y por lo visto también está disponible en la versión PHP 4 (a partir de la 4.1.13). En los comentarios de la documentación de PHP han aportado este código que hace que mysql_set_charset funcione también en versiones anteriores de PHP:

<?php
 if (function_exists('mysql_set_charset') === false) {
     function mysql_set_charset($charset, $link_identifier = null)
     {
         if ($link_identifier == null) {
             return mysql_query('SET NAMES "'.$charset.'"');
         } else {
             return mysql_query('SET NAMES "'.$charset.'"', $link_identifier);
         }
     }
 }
 ?>