Django permite acceder – mediante su ORM – a distintas bases de datos. De serie, Django soporta PostgreSQL, MySQL, SQLite, Oracle y existen “backends” (es decir drivers) no oficiales para IBM DB2, Microsoft SQL Server , Firebird y bases de datos ODBC.
Pero... ¿qué pasa si nuestros datos están en una base de datos para la que no existe – todavía – un backend? ¿cómo de fácil o difícil es escribir nuestro propio backend para esa base de datos?
En esta charla compartiremos nuestra experiencia escribiendo un backend para una base de datos analítica (EXASol DB): ¿cómo lo hemos hecho? ¿qué documentación o referencias hay disponibles? ¿cómo nos aseguramos de que el acceso a los datos es correcto?
Extendiendo Django: Cómo Escribir Tu Propio Backend de Base de Datos - Exasol
1. EXTENDIENDO DJANGO PARA QUE
SE CONECTE A OTRAS BASES DE
DATOS
ESCRIBE TU PROPIO BACKEND
Un caso práctico con EXAsol
@javierabadia
Alicante
PyConEs 2019
Javier Abadía
StyleSage
2.
3. Índice
1. Contexto
2. El ORM de Django
3. Bases de datos Analíticas vsTransaccionales
4. Estructura de un Backend de BBDD
5. Trucos y consejos
11. Django ORM
◦definirmodelos
◦ independientemente de su
representación en la base de
datos
◦generar el esquema de BBDD
◦ que corresponde a dichos
modelos
◦acceder a la BBDD a través de
los modelos
◦ para leer
◦ para escribir
◦¡¡migraciones !!
12. Django ORM - modelos y esquemas
ÚNICA FUENTE DEVERDAD
22. Bases de Datos Transaccionales: PostgreSQL
product_id country brand description current_price
100 us Nike Air Max 2000 124,95
101 us Adidas Originals Forest Hills 65,00
102 uk Adidas Gazelle 95,00
103 uk Nike Color Burst 150,00
• Los datos se almacenan en disco por filas
• Para leer un campo, se lee la fila completa
(un bloque de 4Kb)
• Índices
• RAPIDÍSIMO
23. Bases de Datos Transaccionales: PostgreSQL
product_id country brand description current_price
100 us Nike Air Max 2000 124,95
101 us Adidas Originals Forest Hills 65,00
102 uk Adidas Gazelle 95,00
103 uk Nike Color Burst 150,00
• INSERT
• UPDATE =
implementado como
un DELETE + INSERT
• RAPIDÍSIMO
24.
25. 1. Leer TODAS las filas 2. seleccionar
current_price
3. calcular
MIN, AVG, MAX
26. Bases de Datos Transaccionales: PostgreSQL
product_id country brand description current_price
100 us Nike Air Max 2000 124,95
101 us Adidas Originals Forest Hills 65,00
102 uk Adidas Gazelle 95,00
103 uk Nike Color Burst 150,00
• LENTÍIIIISIMO
• 400M de prod * 10Kb / prod = 3.6Tb
• Leer 4TB a 500Mb/s = +2 horas
27. Bases de Datos Analíticas:
Redshift, SAP HANA, EXAsol
product_id
100
101
102
103
country
us
us
uk
uk
brand
Nike
Adidas
Adidas
Nike
description
Air Max 2000
Originals Forest Hills
Gazelle
Color Burst
current_price
124,95
65,00
95,00
150,00
• Los datos se almacenan en disco por
COLUMNAS
• Con compresión
• Operaciones en Memoria RAM
• Sharding / Paralelización
💶
28. Bases de Datos Analíticas:
Redshift, SAP HANA, EXAsol…
product_id
100
101
102
103
country
us
us
uk
uk
brand
Nike
Adidas
Adidas
Nike
description
Air Max 2000
Originals Forest Hills
Gazelle
Color Burst
current_price
124,95
65,00
95,00
150,00
29.
30. Django ORM - BBDD soportadas
unofficial
3rd party
?
33. Django DB Backends
◦ Python PEP 249
◦ estándar de la API que debe ofrecer una BBDD en Python
◦ connection / cursor
◦ DB Backend = Capa de Adaptación
◦ cadenas de conexión
◦ tipos de datos soportados
◦ funciones especificas
◦ fechas y horas
◦ quoting
◦ LIMIT / OFFSET
◦ distintas capacidades entre BBDD
◦ diferencias de dialecto SQL
34. La estructura de un Backend
◦ podéis examinar dentro de
django
db
backends
base
dummy
mysql
oracle
postgresql
sqlite3
44. Clase Necesario Propósito
DatabaseWrapper Si abrir/cerrar conexiones
CursorWrapper Si ejecutar queries / devolver
resultados
DatabaseFeatures Si
(por defecto)
soporta/no soporta
funcionalidad
DatabaseOperations Si
(incremental)
detalles de
DatabaseSchemaEditor No para migraciones
DatabaseIntrospection No para inspectdb
DatabaseCreation No para unit testing
DatabaseClient No para shell
47. Documentación, Tests, Prueba & Error
◦ No está documentado cómo escribir un ‘backend’
◦ Hay información dispersa (no mucha)
◦ Hay que observar los backends que vienen con Django e
implementar lo necesario
◦ Crear una batería de tests
◦ Comprobar que el SQL es el esperado
48. ¿Cómo ver las queries?
◦ Django DebugToolbar
◦ logging
◦ middleware
◦ cursor wrapper
◦ https://docs.djangoproject.com/en/2.2/topics/db/instrumentation/
◦ instrumentar nuestro
propio cursor
35 minutos de duración + 5 minutos de preguntas
Título: Extendiendo Django para que se conecte a otras Bases de Datos: escribe tu propio backend
Tipo de contribución: (b)
Charla corta
Charla extendida
Póster
Taller
Idioma: (a)
Español
Inglés
Nivel: (a)
Avanzado
Medio
Iniciación
Palabras clave: Django, backend, Base de Datos, SQL
Resumen:
Django permite acceder – mediante su ORM – a distintas bases de datos. De serie, Django soporta PostgreSQL, MySQL, SQLite, Oracle y existen “backends” (es decir drivers) no oficiales para IBM DB2, Microsoft SQL Server , Firebird y bases de datos ODBC.
Pero… ¿qué pasa si nuestros datos están en una base de datos para la que no existe – todavía – un backend? ¿cómo de fácil o difícil es escribir nuestro propio backend para esa base de datos?
En esta charla compartiremos nuestra experiencia escribiendo un backend para una base de datos analítica (EXASol DB): ¿cómo lo hemos hecho? ¿qué documentación o referencias hay disponibles? ¿cómo nos aseguramos de que el acceso a los datos es correcto?
Presentación:
Estructura de la presentación (orientativa):
Introducción
Bases de datos soportadas, variantes de SQL
La estructura de un backend de BBDD de Django
Aspectos relevantes a considerar
Pruebas Unitarias
Conclusiones
Pre-requisitos para atender a la propuesta:
El tema es avanzado y muy específico. Es necesario estar familiarizado con el ORM de Django y SQL.
Otros requerimientos técnicos:
Ninguno en especial: me gustaría usar mi propio ordenador.
Referencias:
Documentación de Django: https://www.djangoproject.com/
diagrama del pipeline
diagrama del pipeline
Django sirve para hacer páginas web
Tiene varias partes:
responder requests
sistema de templates
ORM
…
definir modelos
independientemente de su representación en la base de datos
generar el esquema de BBDD que corresponde a dichos modelos
acceder a la BBDD a través de los modelos
para leer
para escribir
migraciones !!
modelo UML
tabla SQL
modelo en Python
https://djangobook.com/mdj2-models/
definición de los modelos
tipo de dato de cada atributo
restricciones (únique, not null)
valores por defecto
relaciones entre modelos
índices
2. acceso a los datos
consultas simples
consultas con joins
consultas con agregaciones
live coding demo? Python REPL
PostgreSQL
MySQL
SQLite
Oracle
unofficial third party drivers
Podemos acceder a BBDD que no son “propiedad” de nuestra aplicación
Generar unos “modelos” a partir de las tablas/vistas de la BBDD
managed = false
BBDD analítica
BBDD analítica
muchos datos a pocos datos
BBDD analítica
BBDD analítica
BBDD analítica
PostgreSQL
MySQL
SQLite
Oracle
unofficial third party drivers
https://www.python.org/dev/peps/pep-0249/
ilustrar con ejemplos
partes
que hace cada parte?
hay que implementar todo?
por suerte, no
catálogo de funcionalidad soportada por la BBDD
Django puede auto-detectar algunas ‘features’
si sabemos si la bbdd soporta o no soporta la feature, es mejor especificarlo para evitar la autodetección
ej. supports_transactions = True
suelen controlar “edge cases” o funcionalidad específica
inicialmente, ignorarlo
necesarias para ejecutar queries
implementación por defecto para muchas de ellas
implementar según vayan haciendo falta
funciones para modificar el esquema
crear/borrar tablas
crear/modificar/borrar columnas
crear/modificar/borrar índices
necesarias para ejecutar las migraciones
python manage.py migrate
para abrir una “shell” de base de datos
python manage.py dbshell
no es necesario implementarlo