Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT *...

46
Jugando con el ORM de Django Federico Martínez Santiago Avendaño

Transcript of Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT *...

Page 1: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1

Jugando con el ORM de DjangoFederico MartínezSantiago Avendaño

Page 2: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1

¿Qué es un ORM?

Page 3: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1

¿Qué es un ORM?Object

Relational

Mapper

Page 4: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1

¿Qué es un ORM?

Objetos

Modelo

relacional

(Tablas)

Page 5: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1

SQL

Page 6: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1

En esta charla:● Conceptos de bases de datos (relacionales)

● ORM de Django

● Problemas comunes

Page 7: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1

Y por qué hablar debases de datos relacionales?

Page 8: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1

Bases de datos relacionales

Page 9: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1

Bases de datos relacionales● Implementación de la teoría del álgebra

relacional

Page 10: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1

Bases de datos relacionales● Implementación de la teoría del álgebra

relacional

● Usamos tablas que tiene registros

Page 11: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1

Bases de datos relacionales● Implementación de la teoría del álgebra

relacional

● Usamos tablas que tienen registros

● Estan buenísimas

Page 12: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1

¿Qué es una tabla?

Page 13: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1

¿Qué es una tabla?

Col 1 Col 2 Col 3 Col 4A B C DX Y Z W

Page 14: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1

¿Qué es una tabla?(en el fondo)

Page 15: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1

¿Qué es una tabla?(en el fondo)

Page 16: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1

SELECT * FROM tabla

Page 17: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1

SELECT * FROM tabla

Leer todo el archivo!

Page 18: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1

SELECT * FROM tabla WHERE col = 23

Page 19: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1

SELECT * FROM tabla WHERE col = 23

Leer todo el archivo!

Page 20: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1

Joins

Page 21: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1

Joins

Page 22: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1

SELECT * FROM tabla1, tabla2

Page 23: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1

SELECT * FROM tabla1, tabla2

Leer todo el archivo2 por cada registro en archivo1!

Page 24: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1

SELECT * FROM tabla1INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2

Page 25: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1

SELECT * FROM tabla1INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2

Leer todo el archivo2 por cada registro en

archivo1!*

Page 26: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1

SELECT * FROM tabla1, tabla2● Tabla 1: 1000

● Tabla 2: 1000

● Join 1000000

Page 27: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1

Indices

Page 28: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1

Indices

Col 2

1

2

3

Col 1 Col 2 Col 3 Col 4

1

1

2

3

1

2

1

3

3

Page 29: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1

Indices● Búsqueda logarítmica

● Búsqueda por rango

● Claves compuestas

Page 30: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1

IndicesChe, indexemos todo!

Page 31: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1

Pero dónde está todo esto en Django???

Page 32: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1

Modelosfrom django.db import models

class Book(models.Model):

title = models.CharField(max_length=100)

pages = models.PositiveIntegerField()

genre = models.ForeignKey(

Genre, on_delete=models.CASCADE

)

authors = models.ManyToManyField(

Writer, related_name='books'

)

Page 33: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1

Managers y Querysetsall_books = Book.objects.all() SELECT *

FROM library_book

Page 34: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1

FiltrosBook.objects.filter(

title__contains='anillos'

)

SELECT *

FROM library_book

WHERE

title LIKE '%anillos%';

Page 35: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1

JoinsBook.objects.filter(

authors__user__username='JRR'

)

SELECT *

FROM library_book

INNER JOIN library_book_authors

ON library_book.id =

library_book_authors.book_id

INNER JOIN library_writer ON

(library_book_authors.writer_id =

library_writer.id)

INNER JOIN auth_user ON

library_writer.user_id=auth_user.id

WHERE auth_user.username = 'JRR'

Page 36: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1

Indicesclass Book(models.Model):

...

pages = models.PositiveIntegerField(

db_index=True

)

class Writer(models.Model):

class Meta:

indexes = [

models.Index(

fields=['last_name','first_name']),

)

Page 37: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1

Problemas comunes

Page 38: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1

Procesar datos en Pythonpages_list = Book.objects.all()

.values_list('pages', flat=True)

max_pages = max(pages_list)

from django.db.models import Max

max_pages = \

Book.objects.all().aggregate(

Max('pages')

)['pages__max']

Page 39: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1

Muchas queriesall_books = Book.objects.all()

for b in all_books:

print(b.title, b.genre.name)

SELECT * FROM "library_book"

SELECT * FROM "library_genre" WHERE "library_genre"."id" = 4;

SELECT * FROM "library_genre" WHERE "library_genre"."id" = 4;

SELECT * FROM "library_genre" WHERE "library_genre"."id" = 4;

SELECT * FROM "library_genre" WHERE "library_genre"."id" = 4;

SELECT * FROM "library_genre" WHERE "library_genre"."id" = 5;

SELECT * FROM "library_genre" WHERE "library_genre"."id" = 6;

SELECT * FROM "library_genre" WHERE "library_genre"."id" = 6;

Page 40: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1

Muchas queriesall_books = Book.objects.all().select_related("genre")

for b in all_books:

print(b.title, b.genre.name)

SELECT "library_book"."id", "library_book"."title",

"library_book"."pages", "library_book"."genre_id",

"library_book"."publication_date",

"library_genre"."id", "library_genre"."name"

FROM "library_book"

INNER JOIN "library_genre"

ON ("library_book"."genre_id" = "library_genre"."id");

Page 41: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1

Muchas queriesall_books_with_writers = Book.objects.all().prefetch_related('authors')

for b in all_books_with_writers:

print(b.title, b.authors.all())

SELECT * FROM "library_book";

SELECT * FROM "library_writer"

INNER JOIN "library_book_authors"

ON ("library_writer"."id" = "library_book_authors"."writer_id")

WHERE "library_book_authors"."book_id" IN (2, 3, 4, 5, 6, 7, 8, 9, 10, 11,

12, 13, 14, 15) ;

Page 42: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1

Queries innecesarias

Book.objects.filter(authors__user__username__contains='J')

Book.objects.filter(authors__user__username__contains='JR')

Book.objects.filter(authors__user__username__contains='JRR')

Book.objects.filter(authors__user__username__contains='JRR ')

Page 43: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1

Procesamientos innecesarios● Traer datos que no son necesarios

Book.objects.all().select_related('genre').values('title', 'genre__name')

● Ordenar cosas si no es necesario

class Meta:

ordering = ['last_name']

SELECT * FROM "library_writer" ORDER BY "library_writer"."last_name" ASC

Page 44: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1

Nos queda tiempo?

Page 45: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1

Preguntas?

Page 46: Jugando con el ORM de Django€¦ · Leer todo el archivo2 por cada registro en archivo1! SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.col1 = tabla2.col2. SELECT * FROM tabla1

Muchas Gracias!!!