Publicado el Dejar un comentario

Cómo hacer inners joins (concatenaciones internas) con la ORM de Django

Bueno, estamos ahora aquí en un proyecto que utiliza Django como su marco de trabajo.  Y aprendiendo su ORM (mapeo objeto-relacional) me tope con la necesidad de hacer las famosas concatenaciones (joins) entre dos o más entidades.

Anteriormente he trabajado con las ORM de java (Hibernate, EclipseLink) y de .Net (Entity Framework) así que la de ORM  de Django y su QuerySet debería ser capaz de hacer concatenaciones (joins).

Para hacer concatenaciones internas en Django, utilizamos la función select_related(). Según la documentación, esta función sólo sigue relaciones de llaves foráneas (foreign-key), es decir, de tablas hijas a tablas padre o relaciones de uno a uno.

Imagina los registros en una tabla que representa los artículos vendidos de una factura. Llamaremos a la table linea_factura. Esta tabla tendrá como llaves foráneas el identificador de la factura de la tabla factura y el identificador del artículo de la tabla articulo.

Con select_related() sólo podríamos seguir las relaciones de llaves foráneas, es decir sólo podríamos relacional las lineas de la factura con la factura y/o con los artículos pero no en el sentido contrario, es decir, de la factura hacia las lineas de la factura, o de artículos  la linea de artículo. Para esto existe otra función que aún no he probado y espero tratar más adelante.

El código siguiente, que omite la definición de los modelos,  para obtener el QuerySet quedaría así:

lineas_factura = linea_factura.objects.select_related(‘factura’)
.select_relate(‘articulo’).filter(factura__no = 89)

Una vez que el programa haga referencia a la variable lineas_factura, este QuerySet lanzará la consulta sql con dos joins y cargará con los registros de linea_factura y la información relacionada de la tabla factura y de la tabla artículo, donde el número de  factura sea igual a 89. Es decir, la factura número 89 y su detalle.

Espero les sea claro. Si no, comenta el post.

¡Hasta la próxima!

 

Publicado el Dejar un comentario

Herramientas de SAGA no se muestran en QGIS 2.18 en Ubuntu 16.04

Después de instalar la versión de 2.18 de QGIS y de haber instalado la versión 2.2.3 de SAGA en mi PC con Ubuntu 16.04, las herramientas de SAGA no me aparecían en la caja de herramientas de QGIS.

Buscando en internet encontré la solución en el sitio de gis.stackexchange.com.

Cerré QGIS y edité el archivo:  /usr/share/qgis/python/plugins/processing/algs/saga/SagaAlgorithmProvider.py
Cambiando la línea 76:
if not version.startswith(‘2.3.’):
por:
if not version.startswith(‘2.2.‘):

Guardé cambios, ejecuté nuevamente QGIS y las herramientas de SAGA aparecieron. Al parecer las nuevas versiones de QGIS 2.18 busca la versión 2.3.x de SAGA, y es por eso que no inicializaba las herramientas.

¡Hasta la próxima!

Publicado el Dejar un comentario

Cómo definir una llave primaria (primary key) en una tabla existente en Oracle.

Supongamos que tenemos una tabla sin llave primaria y todos sus campos fueron definidos para aceptar valores nulos. El comando CREATE TABLE de dicha tabla se ejecutó así:

CREATE TABLE ENTIDAD 
   (	CVE_ENT VARCHAR2(3), 
	NOM_ENT VARCHAR2(150), 
	NOM_ABR VARCHAR2(20)
   );

Una llave primaria o PRIMARY KEY puede estar formada por uno o varios campos, cuyos valores permiten identificar un sólo registro en la tabla. Luego entonces el campo que vayamos a escoger no debe permitir valores nulos (sin valor) ni repetidos. Identificamos que los valores del campo CVE_ENT son irrepetibles y que identifican a un sólo registro en la tabla.

Para modificar las propiedades de este campo y  que este no permita nulos de ahora en adelante, ejecutamos la siguiente sentencia:

ALTER TABLE ENTIDAD  
MODIFY (CVE_ENT NOT NULL);

Alteramos la tabla ENTIDAD modificando el campo CEV_ENT especificándole la restricción NOT NULL. Una vez ejecutada la sentencia, el campo ya no permitirá valores nulos.

Una vez logrado esto, procedemos a definir el campo CEVE_ENT como llave primaria de la tabla de esta forma:

ALTER TABLE ENTIDAD
ADD CONSTRAINT ENTIDAD_PK PRIMARY KEY 
(
  CVE_ENT 
);

Alteramos la tabla ENTIDAD agregando la restricción llave primaria (PRIMARY KEY) llamada ENTIDAD_PK conformada por el campo CVE_ENT.

Cabe aclarar que la restricción PRIMARY KEY, en Oracle, lleva implícito el no aceptar valores nulos en los campos que la conforman, sin embargo es buena práctica especificar explícitamente antes que el campo o campos que conformarán dicha llave primaria no acepten nulos con la sentencia ALTER que vimos anteriormente, ya que algunos motores de bases de datos así lo requieren.

¡Hasta la próxima!