SlideShare una empresa de Scribd logo
1 de 52
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
Í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
StyleSage
BBDD
BBDD
AnalíticaBBDDdata pipeline BBDD
Analítica
ETL
StyleSage
BBDD
Analítica
BBDD
Analítica
TL
Django
https://developer.mozilla.org/en-US/docs/Learn/Server-side/Django/Introduction
EL ORM DE
¿Amor / Odio?
¡HAMOR!
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 !!
Django ORM - modelos y esquemas
ÚNICA FUENTE DEVERDAD
Django ORM - consultas
Django ORM - BBDD soportadas
unofficial
3rd party
Django ORM para BBDD externas
¿Cómo funciona el ORM?
◦ Model
◦ Manager
◦ QuerySet
◦ Query
◦ Database Backend
◦ SQLCompiler
¿Cómo funciona el ORM?
◦ Model
◦ Manager
◦ QuerySet
◦ Query
◦ Database
Backend
◦ SQLCompiler
¿Cómo funciona el ORM?
◦ Model
◦ Manager
◦ QuerySet
◦ Query
◦ Database
Backend
◦ SQLCompiler
¿Cómo funciona el ORM?
◦ Model
◦ Manager
◦ QuerySet
◦ Query
◦ Database
Backend
◦ SQLCompiler
¿Cómo funciona el ORM?
◦ Model
◦ Manager
◦ QuerySet
◦ Query
◦ Database
Backend
◦ SQLCompiler
BASES DE DATOS
Transaccionales y Analíticas
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
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
1. Leer TODAS las filas 2. seleccionar
current_price
3. calcular
MIN, AVG, MAX
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
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
💶
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
Django ORM - BBDD soportadas
unofficial
3rd party
?
DIY DB BACKEND
por Juan Palomo
🤮
Django
Las piezas necesarias
Django Backend
django-pyodbc
Django Backend
JDBC Driver ODBC Driver
ODBC
unixODBC
pyODBC
red, paquetes TCP/IP
Native Driver
PEP-249
≈PEP-249
🤮 🤮
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
La estructura de un Backend
◦ podéis examinar dentro de
django
db
backends
base
dummy
mysql
oracle
postgresql
sqlite3
DatabaseWrapper
CursorWrapper
DatabaseFeatures
DatabaseOperations
DatabaseSchemaEditor
DatabaseIntrospection
DatabaseCreation
DatabaseClient
Piezas de un Backend
DatabaseWrapper
CursorWrapper
DatabaseFeatures
DatabaseOperations
DatabaseSchemaEditor
DatabaseIntrospection
DatabaseCreation
DatabaseClient
Piezas de un Backend
clase principal
referencias al resto de clases
abriry cerrar conexiones
crear cursores
🙋🏼♀️
DatabaseWrapper
CursorWrapper
DatabaseFeatures
DatabaseOperations
DatabaseSchemaEditor
DatabaseIntrospection
DatabaseCreation
DatabaseClient
Piezas de un Backend
ejecutar las queries
devolver los resultados
“envuelve” un cursor PEP-249
🙋🏼♀️
🙋🏼♀️
DatabaseWrapper
CursorWrapper
DatabaseFeatures
DatabaseOperations
DatabaseSchemaEditor
DatabaseIntrospection
DatabaseCreation
DatabaseClient
Piezas de un Backend
catálogo de
funcionalidad
soportada por la
BBDD
🙋🏼♀️
🙋🏼♀️
💁🏼♀️
DatabaseWrapper
CursorWrapper
DatabaseFeatures
DatabaseOperations
DatabaseSchemaEditor
DatabaseIntrospection
DatabaseCreation
DatabaseClient
Piezas de un Backend
operacionesauxiliares
quote_name()
datetime_extract_sql()
…
🙋🏼♀️
🙋🏼♀️
💁🏼♀️
💁🏼♀️
DatabaseWrapper
CursorWrapper
DatabaseFeatures
DatabaseOperations
DatabaseSchemaEditor
DatabaseIntrospection
DatabaseCreation
DatabaseClient
Piezas de un Backend
funcionespara modificar el esquema
crear/borrar tablas
crear/modificar/borrar columnas
crear/modificar/borrar índices
🙋🏼♀️
🙋🏼♀️
💁🏼♀️
💁🏼♀️
🙅🏼♀️
DatabaseWrapper
CursorWrapper
DatabaseFeatures
DatabaseOperations
DatabaseSchemaEditor
DatabaseIntrospection
DatabaseCreation
DatabaseClient
Piezas de un Backend
🙋🏼♀️
🙋🏼♀️
💁🏼♀️
💁🏼♀️
🙅🏼♀️
🙅🏼♀️
DatabaseWrapper
CursorWrapper
DatabaseFeatures
DatabaseOperations
DatabaseSchemaEditor
DatabaseIntrospection
DatabaseCreation
DatabaseClient
Piezas de un Backend
crear y destruir bases
de datos
🙋🏼♀️
🙋🏼♀️
💁🏼♀️
💁🏼♀️
🙅🏼♀️
🙅🏼♀️
🙅🏼♀️
para ejecución de
tests
DatabaseWrapper
CursorWrapper
DatabaseFeatures
DatabaseOperations
DatabaseSchemaEditor
DatabaseIntrospection
DatabaseCreation
DatabaseClient
Piezas de un Backend
🙅🏼♀️
🙋🏼♀️
🙋🏼♀️
💁🏼♀️
💁🏼♀️
🙅🏼♀️
🙅🏼♀️
🙅🏼♀️
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
LECCIONES
APRENDIDAS
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
¿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
Consideraciones Prácticas
◦ paquete
instalable en
modo edición
Conclusiones
◦ se puede
◦ merece la pena
◦ ármate de paciencia
◦ pruebas
@javierabadia
Alicante
PyConEs 2019
Javier Abadía
StyleSage
Referencias
◦ https://es.slideshare.net/HctorPablosLpez/exprimiendo-el-orm-de-django
◦ https://reinout.vanrees.org/weblog/2016/11/04/database-backends.html
◦ https://www.djangounderthehood.com/talks/ (Michael Manfre - Custom
Database Backends)
◦ https://www.youtube.com/watch?v=tkwZ1jG3XgA (James Benett - Django in
Depth, PyCon 2015)
◦ https://github.com/mkleehammer/pyodbc
◦ https://github.com/mkleehammer/pyodbc/wiki
◦ https://github.com/lionheart/django-pyodbc
◦ https://github.com/opbeat/django-postgres-readonly

Más contenido relacionado

La actualidad más candente

Melanoma Skin Cancer Detection using Image Processing and Machine Learning
Melanoma Skin Cancer Detection using Image Processing and Machine LearningMelanoma Skin Cancer Detection using Image Processing and Machine Learning
Melanoma Skin Cancer Detection using Image Processing and Machine Learning
ijtsrd
 
Proyecto de una Red LAN
Proyecto de una Red LANProyecto de una Red LAN
Proyecto de una Red LAN
Odette Cf
 
Conceptual enlace de datos
Conceptual enlace de datosConceptual enlace de datos
Conceptual enlace de datos
gchv
 
ejercicios-resueltos-en-pascal
ejercicios-resueltos-en-pascalejercicios-resueltos-en-pascal
ejercicios-resueltos-en-pascal
kurt9123
 

La actualidad más candente (20)

Elementos que componen una red inalambrica
Elementos  que componen una red inalambricaElementos  que componen una red inalambrica
Elementos que componen una red inalambrica
 
Techniques of Brain Cancer Detection from MRI using Machine Learning
Techniques of Brain Cancer Detection from MRI using Machine LearningTechniques of Brain Cancer Detection from MRI using Machine Learning
Techniques of Brain Cancer Detection from MRI using Machine Learning
 
A survey of deep learning approaches to medical applications
A survey of deep learning approaches to medical applicationsA survey of deep learning approaches to medical applications
A survey of deep learning approaches to medical applications
 
Melanoma Skin Cancer Detection using Image Processing and Machine Learning
Melanoma Skin Cancer Detection using Image Processing and Machine LearningMelanoma Skin Cancer Detection using Image Processing and Machine Learning
Melanoma Skin Cancer Detection using Image Processing and Machine Learning
 
Speech Processing with deep learning
Speech Processing  with deep learningSpeech Processing  with deep learning
Speech Processing with deep learning
 
Text compression
Text compressionText compression
Text compression
 
Toxic Comment Classification
Toxic Comment ClassificationToxic Comment Classification
Toxic Comment Classification
 
Proyecto de una Red LAN
Proyecto de una Red LANProyecto de una Red LAN
Proyecto de una Red LAN
 
PPT on BRAIN TUMOR detection in MRI images based on IMAGE SEGMENTATION
PPT on BRAIN TUMOR detection in MRI images based on  IMAGE SEGMENTATION PPT on BRAIN TUMOR detection in MRI images based on  IMAGE SEGMENTATION
PPT on BRAIN TUMOR detection in MRI images based on IMAGE SEGMENTATION
 
Human Emotion Recognition using Machine Learning
Human Emotion Recognition using Machine LearningHuman Emotion Recognition using Machine Learning
Human Emotion Recognition using Machine Learning
 
Machine Learning - Object Detection and Classification
Machine Learning - Object Detection and ClassificationMachine Learning - Object Detection and Classification
Machine Learning - Object Detection and Classification
 
Lung Cancer Detection using Machine Learning
Lung Cancer Detection using Machine LearningLung Cancer Detection using Machine Learning
Lung Cancer Detection using Machine Learning
 
Introducción a la ingeniería del software
Introducción a la ingeniería del softwareIntroducción a la ingeniería del software
Introducción a la ingeniería del software
 
Pneumonia Classification using Transfer Learning
Pneumonia Classification using Transfer LearningPneumonia Classification using Transfer Learning
Pneumonia Classification using Transfer Learning
 
Tipos de redes
Tipos de redesTipos de redes
Tipos de redes
 
Conceptual enlace de datos
Conceptual enlace de datosConceptual enlace de datos
Conceptual enlace de datos
 
Medios no guiados
Medios no guiadosMedios no guiados
Medios no guiados
 
Inteligencia Artificial
Inteligencia ArtificialInteligencia Artificial
Inteligencia Artificial
 
ejercicios-resueltos-en-pascal
ejercicios-resueltos-en-pascalejercicios-resueltos-en-pascal
ejercicios-resueltos-en-pascal
 
Machine learning for Music
Machine learning for MusicMachine learning for Music
Machine learning for Music
 

Similar a Extendiendo Django: Cómo Escribir Tu Propio Backend de Base de Datos - Exasol

Documentacion postgresql
Documentacion postgresqlDocumentacion postgresql
Documentacion postgresql
Cesar Martinez
 
Lps 18 basesdedatos
Lps 18 basesdedatosLps 18 basesdedatos
Lps 18 basesdedatos
Robert Wolf
 
140 D Bcripto Protegiendo Datos En Aplicaciones Genexus Web
140 D Bcripto Protegiendo Datos En Aplicaciones Genexus Web140 D Bcripto Protegiendo Datos En Aplicaciones Genexus Web
140 D Bcripto Protegiendo Datos En Aplicaciones Genexus Web
GeneXus
 
cuadro_comparativo_SGBD_top_10.docx (1).docx
cuadro_comparativo_SGBD_top_10.docx (1).docxcuadro_comparativo_SGBD_top_10.docx (1).docx
cuadro_comparativo_SGBD_top_10.docx (1).docx
Igor Rodriguez
 

Similar a Extendiendo Django: Cómo Escribir Tu Propio Backend de Base de Datos - Exasol (20)

DB1 Unidad 3: Diseño físico relacional
DB1 Unidad 3: Diseño físico relacionalDB1 Unidad 3: Diseño físico relacional
DB1 Unidad 3: Diseño físico relacional
 
24 HOP edición Español - Patrones de escalalidad en microsoft azure sql datab...
24 HOP edición Español - Patrones de escalalidad en microsoft azure sql datab...24 HOP edición Español - Patrones de escalalidad en microsoft azure sql datab...
24 HOP edición Español - Patrones de escalalidad en microsoft azure sql datab...
 
(25/02) Desarrollador@S Invita - Introducción y novedades de SQL Server 2008
(25/02) Desarrollador@S Invita - Introducción y novedades de SQL Server 2008(25/02) Desarrollador@S Invita - Introducción y novedades de SQL Server 2008
(25/02) Desarrollador@S Invita - Introducción y novedades de SQL Server 2008
 
Codeigniter101
Codeigniter101Codeigniter101
Codeigniter101
 
Postgresql expo
Postgresql expoPostgresql expo
Postgresql expo
 
Rendimiento en aplicaciones web con Symfony2
Rendimiento en aplicaciones web con Symfony2Rendimiento en aplicaciones web con Symfony2
Rendimiento en aplicaciones web con Symfony2
 
Database fundamental itprosdc_chapter2
Database fundamental itprosdc_chapter2Database fundamental itprosdc_chapter2
Database fundamental itprosdc_chapter2
 
Documentacion postgresql
Documentacion postgresqlDocumentacion postgresql
Documentacion postgresql
 
Lps 18 basesdedatos
Lps 18 basesdedatosLps 18 basesdedatos
Lps 18 basesdedatos
 
Lps 18 basesdedatos
Lps 18 basesdedatosLps 18 basesdedatos
Lps 18 basesdedatos
 
Meetup Spark 2.0
Meetup Spark 2.0Meetup Spark 2.0
Meetup Spark 2.0
 
Conociendo los cambios de SQL Server a partir de 2012 a 2016
Conociendo los cambios de SQL Server a partir de 2012 a 2016Conociendo los cambios de SQL Server a partir de 2012 a 2016
Conociendo los cambios de SQL Server a partir de 2012 a 2016
 
Global Azure Bootcamp 2016 Bogota SQL2016 dba IaaS PaaS v4
Global Azure Bootcamp 2016 Bogota SQL2016 dba IaaS PaaS v4Global Azure Bootcamp 2016 Bogota SQL2016 dba IaaS PaaS v4
Global Azure Bootcamp 2016 Bogota SQL2016 dba IaaS PaaS v4
 
Presentación: Administración y programación de bases de datos relacionales.
Presentación: Administración y programación de bases de datos relacionales.Presentación: Administración y programación de bases de datos relacionales.
Presentación: Administración y programación de bases de datos relacionales.
 
140 D Bcripto Protegiendo Datos En Aplicaciones Genexus Web
140 D Bcripto Protegiendo Datos En Aplicaciones Genexus Web140 D Bcripto Protegiendo Datos En Aplicaciones Genexus Web
140 D Bcripto Protegiendo Datos En Aplicaciones Genexus Web
 
Explorando los Sabores de Azure DW
Explorando los Sabores de Azure DWExplorando los Sabores de Azure DW
Explorando los Sabores de Azure DW
 
Jdbc
JdbcJdbc
Jdbc
 
cuadro_comparativo_SGBD_top_10.docx (1).docx
cuadro_comparativo_SGBD_top_10.docx (1).docxcuadro_comparativo_SGBD_top_10.docx (1).docx
cuadro_comparativo_SGBD_top_10.docx (1).docx
 
Sistemas de gestión de base de datos
Sistemas de gestión de base de datosSistemas de gestión de base de datos
Sistemas de gestión de base de datos
 
Base de Datos en Microsoft SQL Server
Base de Datos en Microsoft SQL ServerBase de Datos en Microsoft SQL Server
Base de Datos en Microsoft SQL Server
 

Más de Javier Abadía

Más de Javier Abadía (12)

Python Asíncrono - Async Python
Python Asíncrono - Async PythonPython Asíncrono - Async Python
Python Asíncrono - Async Python
 
UX/UI para Desarrolladores
UX/UI para DesarrolladoresUX/UI para Desarrolladores
UX/UI para Desarrolladores
 
Reactividad en Angular, React y VueJS
Reactividad en Angular, React y VueJSReactividad en Angular, React y VueJS
Reactividad en Angular, React y VueJS
 
Las reglas que hay que romper para que tu equipo de desarrollo sea el más RÁPIDO
Las reglas que hay que romper para que tu equipo de desarrollo sea el más RÁPIDOLas reglas que hay que romper para que tu equipo de desarrollo sea el más RÁPIDO
Las reglas que hay que romper para que tu equipo de desarrollo sea el más RÁPIDO
 
Retos de Programación en Python
Retos de Programación en PythonRetos de Programación en Python
Retos de Programación en Python
 
Django + Vue, JavaScript de 3ª generación para modernizar Django
Django + Vue, JavaScript de 3ª generación para modernizar DjangoDjango + Vue, JavaScript de 3ª generación para modernizar Django
Django + Vue, JavaScript de 3ª generación para modernizar Django
 
Vue.js + Django - configuración para desarrollo con webpack y HMR
Vue.js + Django - configuración para desarrollo con webpack y HMRVue.js + Django - configuración para desarrollo con webpack y HMR
Vue.js + Django - configuración para desarrollo con webpack y HMR
 
Anatomía de un Bot para Resultados Electorales
Anatomía de un Bot para Resultados ElectoralesAnatomía de un Bot para Resultados Electorales
Anatomía de un Bot para Resultados Electorales
 
Deep learning image classification aplicado al mundo de la moda
Deep learning image classification aplicado al mundo de la modaDeep learning image classification aplicado al mundo de la moda
Deep learning image classification aplicado al mundo de la moda
 
Análisis de colores: cómo analizar tendencias de moda automáticamente
 Análisis de colores: cómo analizar tendencias de moda automáticamente Análisis de colores: cómo analizar tendencias de moda automáticamente
Análisis de colores: cómo analizar tendencias de moda automáticamente
 
Codemotion 2016 - d3.js un taller divertido y difícil
Codemotion 2016 - d3.js un taller divertido y difícilCodemotion 2016 - d3.js un taller divertido y difícil
Codemotion 2016 - d3.js un taller divertido y difícil
 
La Noche Electoral
La Noche ElectoralLa Noche Electoral
La Noche Electoral
 

Extendiendo Django: Cómo Escribir Tu Propio Backend de Base de Datos - Exasol

Notas del editor

  1. 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/
  2. diagrama del pipeline
  3. diagrama del pipeline
  4. Django sirve para hacer páginas web Tiene varias partes: responder requests sistema de templates ORM …
  5. 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 !!
  6. 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
  7. 2. acceso a los datos consultas simples consultas con joins consultas con agregaciones live coding demo? Python REPL
  8. PostgreSQL MySQL SQLite Oracle unofficial third party drivers
  9. 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
  10. BBDD analítica
  11. BBDD analítica
  12. muchos datos a pocos datos
  13. BBDD analítica
  14. BBDD analítica
  15. BBDD analítica
  16. PostgreSQL MySQL SQLite Oracle unofficial third party drivers
  17. https://www.python.org/dev/peps/pep-0249/
  18. ilustrar con ejemplos
  19. partes que hace cada parte? hay que implementar todo? por suerte, no
  20. 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
  21. necesarias para ejecutar queries implementación por defecto para muchas de ellas implementar según vayan haciendo falta
  22. 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
  23. para abrir una “shell” de base de datos python manage.py dbshell no es necesario implementarlo
  24. https://docs.djangoproject.com/en/2.2/topics/db/instrumentation/