Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

68 views

Published on

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?

Published in: Software
  • Be the first to comment

  • Be the first to like this

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

  1. 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. 2. Í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
  3. 3. StyleSage BBDD BBDD AnalíticaBBDDdata pipeline BBDD Analítica ETL
  4. 4. StyleSage BBDD Analítica BBDD Analítica TL
  5. 5. Django https://developer.mozilla.org/en-US/docs/Learn/Server-side/Django/Introduction
  6. 6. EL ORM DE ¿Amor / Odio?
  7. 7. ¡HAMOR!
  8. 8. 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 !!
  9. 9. Django ORM - modelos y esquemas ÚNICA FUENTE DEVERDAD
  10. 10. Django ORM - consultas
  11. 11. Django ORM - BBDD soportadas unofficial 3rd party
  12. 12. Django ORM para BBDD externas
  13. 13. ¿Cómo funciona el ORM? ◦ Model ◦ Manager ◦ QuerySet ◦ Query ◦ Database Backend ◦ SQLCompiler
  14. 14. ¿Cómo funciona el ORM? ◦ Model ◦ Manager ◦ QuerySet ◦ Query ◦ Database Backend ◦ SQLCompiler
  15. 15. ¿Cómo funciona el ORM? ◦ Model ◦ Manager ◦ QuerySet ◦ Query ◦ Database Backend ◦ SQLCompiler
  16. 16. ¿Cómo funciona el ORM? ◦ Model ◦ Manager ◦ QuerySet ◦ Query ◦ Database Backend ◦ SQLCompiler
  17. 17. ¿Cómo funciona el ORM? ◦ Model ◦ Manager ◦ QuerySet ◦ Query ◦ Database Backend ◦ SQLCompiler
  18. 18. BASES DE DATOS Transaccionales y Analíticas
  19. 19. 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
  20. 20. 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
  21. 21. 1. Leer TODAS las filas 2. seleccionar current_price 3. calcular MIN, AVG, MAX
  22. 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 • LENTÍIIIISIMO • 400M de prod * 10Kb / prod = 3.6Tb • Leer 4TB a 500Mb/s = +2 horas
  23. 23. 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 💶
  24. 24. 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
  25. 25. Django ORM - BBDD soportadas unofficial 3rd party ?
  26. 26. DIY DB BACKEND por Juan Palomo
  27. 27. 🤮 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 🤮 🤮
  28. 28. 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
  29. 29. La estructura de un Backend ◦ podéis examinar dentro de django db backends base dummy mysql oracle postgresql sqlite3
  30. 30. DatabaseWrapper CursorWrapper DatabaseFeatures DatabaseOperations DatabaseSchemaEditor DatabaseIntrospection DatabaseCreation DatabaseClient Piezas de un Backend
  31. 31. DatabaseWrapper CursorWrapper DatabaseFeatures DatabaseOperations DatabaseSchemaEditor DatabaseIntrospection DatabaseCreation DatabaseClient Piezas de un Backend clase principal referencias al resto de clases abriry cerrar conexiones crear cursores 🙋🏼♀️
  32. 32. DatabaseWrapper CursorWrapper DatabaseFeatures DatabaseOperations DatabaseSchemaEditor DatabaseIntrospection DatabaseCreation DatabaseClient Piezas de un Backend ejecutar las queries devolver los resultados “envuelve” un cursor PEP-249 🙋🏼♀️ 🙋🏼♀️
  33. 33. DatabaseWrapper CursorWrapper DatabaseFeatures DatabaseOperations DatabaseSchemaEditor DatabaseIntrospection DatabaseCreation DatabaseClient Piezas de un Backend catálogo de funcionalidad soportada por la BBDD 🙋🏼♀️ 🙋🏼♀️ 💁🏼♀️
  34. 34. DatabaseWrapper CursorWrapper DatabaseFeatures DatabaseOperations DatabaseSchemaEditor DatabaseIntrospection DatabaseCreation DatabaseClient Piezas de un Backend operacionesauxiliares quote_name() datetime_extract_sql() … 🙋🏼♀️ 🙋🏼♀️ 💁🏼♀️ 💁🏼♀️
  35. 35. 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 🙋🏼♀️ 🙋🏼♀️ 💁🏼♀️ 💁🏼♀️ 🙅🏼♀️
  36. 36. DatabaseWrapper CursorWrapper DatabaseFeatures DatabaseOperations DatabaseSchemaEditor DatabaseIntrospection DatabaseCreation DatabaseClient Piezas de un Backend 🙋🏼♀️ 🙋🏼♀️ 💁🏼♀️ 💁🏼♀️ 🙅🏼♀️ 🙅🏼♀️
  37. 37. DatabaseWrapper CursorWrapper DatabaseFeatures DatabaseOperations DatabaseSchemaEditor DatabaseIntrospection DatabaseCreation DatabaseClient Piezas de un Backend crear y destruir bases de datos 🙋🏼♀️ 🙋🏼♀️ 💁🏼♀️ 💁🏼♀️ 🙅🏼♀️ 🙅🏼♀️ 🙅🏼♀️ para ejecución de tests
  38. 38. DatabaseWrapper CursorWrapper DatabaseFeatures DatabaseOperations DatabaseSchemaEditor DatabaseIntrospection DatabaseCreation DatabaseClient Piezas de un Backend 🙅🏼♀️ 🙋🏼♀️ 🙋🏼♀️ 💁🏼♀️ 💁🏼♀️ 🙅🏼♀️ 🙅🏼♀️ 🙅🏼♀️
  39. 39. 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
  40. 40. LECCIONES APRENDIDAS
  41. 41. 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
  42. 42. ¿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
  43. 43. Consideraciones Prácticas ◦ paquete instalable en modo edición
  44. 44. Conclusiones ◦ se puede ◦ merece la pena ◦ ármate de paciencia ◦ pruebas
  45. 45. @javierabadia Alicante PyConEs 2019 Javier Abadía StyleSage
  46. 46. 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

×