SlideShare a Scribd company logo
1 of 16
Импорт данных
Модель
class Product():
code = models.CharField(max_length=10)
price = models.IntegerField(default=0)
Код Цена
12345 100
54321 200
11111 150
Входные данные
Модель
class Product():
code = models.CharField(max_length=10)
price = models.IntegerField(default=0)
class Product():
code = models.CharField(max_length=10)
price = models.IntegerField(default=0)
Код Цена
12345 100
54321 200
11111 150
Входные данные
10^6 записей
10^4 обновляем
Модель
lines = [
["0001", 10],
["0002", 15],
]
for line in lines:
Product.objects.filter(
code=line[0]
).update(
price=line[1]
)
Шаг 1. Просто
class Product():
code = models.CharField(max_length=10, unique=True, db_index=True)
price = models.IntegerField(default=0)
Шаг 2. Индексы
x100
Шаг 2. Индексы
1 2 3 4 5 6 7 8 9 10
Шаг 2. Индексы
1 2 3 4 5 6 7 8 9 10
6
4
2
1 3
5
8
7 9
10
class Product():
code = models.CharField(max_length=10, unique=True, db_index=True)
price = models.IntegerField(default=0)
class Product2(models.Model):
category = models.ForeignKey('Category')
service = models.ForeignKey('Service')
price = models.IntegerField(default=0)
class Meta:
unique_together = ('category2', 'service')
index_together = ('category2', 'service')
Шаг 2. Индексы
lines = [
["0001", 10],
["0002", 15],
]
with transaction.atomic():
for line in lines:
Product.objects.filter(
code=line[0]
).update(
price=line[1]
)
Шаг 3. atomic
x1.4
Обычные запросы
UPDATE app_product SET price = 3 WHERE code ='0001';
UPDATE app_product SET price = 2 WHERE code ='0002';
Запросы с условиями (postgresql)
UPDATE app_product SET price = (CASE
WHEN code = '0001' THEN 3
WHEN code = '0002' THEN 2
ELSE 0
END);
Шаг 4. Запросы с условиями
Обычные запросы
UPDATE app_product SET price = 3 WHERE code ='0001';
UPDATE app_product SET price = 2 WHERE code ='0002';
Запросы с условиями (postgresql)
UPDATE app_product SET price = (CASE
WHEN code = '0001' THEN 3
WHEN code = '0002' THEN 2
ELSE 0
END) WHERE code in ('0001','0002’);
Шаг 4. Запросы с условиями
Обновление одним запросом
UPDATE app_product SET price = (CASE
WHEN code = '0091' THEN 3 WHEN code = '0092' THEN 3
WHEN code = '0093' THEN 3 WHEN code = '0094' THEN 3
WHEN code = '0095' THEN 3 WHEN code = '0096' THEN 3
WHEN code = '0097' THEN 3 WHEN code = '0098' THEN 3
WHEN code = '0099' THEN 3 WHEN code = '0100' THEN 3
ELSE 0 END
)
WHERE code in
('0091','0092','0093','0094','0095','0096','0097','0098','0099','0100');
Шаг 4. Запросы с условиями
x2.5
Шаг 5. Количество запросов
0
500
1000
1500
2000
2500
1 3 5 100 500 1000 2000 10000
Сколько объектов нужно обновлять в одном запросе?
x30
Шаг 5. Количество запросов
from django.db.models.fields import CharField
from django.db.models.expressions import When, Case
case = Case(
When(code='0001', then=10),
When(code='0002', then=15),
default=0, output_field=CharField(),
)
when_list = [When(code=line[0], then=line[1]) for line in lines]
case = Case(*when_list, default=0, output_field=CharField())
Product.objects.update(price=case)
Шаг 5. Django 1.8

More Related Content

Viewers also liked

The human body
The human bodyThe human body
The human bodyDiegoRmej
 
Tridhaatu aum-ebrochure
Tridhaatu aum-ebrochureTridhaatu aum-ebrochure
Tridhaatu aum-ebrochuretridhaatuinfra
 
Winter league result 7 12-13
Winter league result 7 12-13Winter league result 7 12-13
Winter league result 7 12-13CJH47
 
First aid attendant performance appraisal
First aid attendant performance appraisalFirst aid attendant performance appraisal
First aid attendant performance appraisalstephenrivera801
 
Snap mirror source to tape to destination scenario
Snap mirror source to tape to destination scenarioSnap mirror source to tape to destination scenario
Snap mirror source to tape to destination scenarioAccenture
 
Arbeitszeugnisse Breidbach 2016
Arbeitszeugnisse Breidbach 2016Arbeitszeugnisse Breidbach 2016
Arbeitszeugnisse Breidbach 2016Thomas Breidbach
 
LetterofRecommendation-Meyer
LetterofRecommendation-MeyerLetterofRecommendation-Meyer
LetterofRecommendation-MeyerVirginia Meyer
 

Viewers also liked (10)

The human body
The human bodyThe human body
The human body
 
Tridhaatu aum-ebrochure
Tridhaatu aum-ebrochureTridhaatu aum-ebrochure
Tridhaatu aum-ebrochure
 
Asal usul bahasa melayu
Asal usul bahasa melayuAsal usul bahasa melayu
Asal usul bahasa melayu
 
Winter league result 7 12-13
Winter league result 7 12-13Winter league result 7 12-13
Winter league result 7 12-13
 
I
II
I
 
First aid attendant performance appraisal
First aid attendant performance appraisalFirst aid attendant performance appraisal
First aid attendant performance appraisal
 
Snap mirror source to tape to destination scenario
Snap mirror source to tape to destination scenarioSnap mirror source to tape to destination scenario
Snap mirror source to tape to destination scenario
 
J
JJ
J
 
Arbeitszeugnisse Breidbach 2016
Arbeitszeugnisse Breidbach 2016Arbeitszeugnisse Breidbach 2016
Arbeitszeugnisse Breidbach 2016
 
LetterofRecommendation-Meyer
LetterofRecommendation-MeyerLetterofRecommendation-Meyer
LetterofRecommendation-Meyer
 

Импорт данных в django

  • 2. Модель class Product(): code = models.CharField(max_length=10) price = models.IntegerField(default=0)
  • 3. Код Цена 12345 100 54321 200 11111 150 Входные данные Модель class Product(): code = models.CharField(max_length=10) price = models.IntegerField(default=0)
  • 4. class Product(): code = models.CharField(max_length=10) price = models.IntegerField(default=0) Код Цена 12345 100 54321 200 11111 150 Входные данные 10^6 записей 10^4 обновляем Модель
  • 5. lines = [ ["0001", 10], ["0002", 15], ] for line in lines: Product.objects.filter( code=line[0] ).update( price=line[1] ) Шаг 1. Просто
  • 6. class Product(): code = models.CharField(max_length=10, unique=True, db_index=True) price = models.IntegerField(default=0) Шаг 2. Индексы x100
  • 7. Шаг 2. Индексы 1 2 3 4 5 6 7 8 9 10
  • 8. Шаг 2. Индексы 1 2 3 4 5 6 7 8 9 10 6 4 2 1 3 5 8 7 9 10
  • 9. class Product(): code = models.CharField(max_length=10, unique=True, db_index=True) price = models.IntegerField(default=0) class Product2(models.Model): category = models.ForeignKey('Category') service = models.ForeignKey('Service') price = models.IntegerField(default=0) class Meta: unique_together = ('category2', 'service') index_together = ('category2', 'service') Шаг 2. Индексы
  • 10. lines = [ ["0001", 10], ["0002", 15], ] with transaction.atomic(): for line in lines: Product.objects.filter( code=line[0] ).update( price=line[1] ) Шаг 3. atomic x1.4
  • 11. Обычные запросы UPDATE app_product SET price = 3 WHERE code ='0001'; UPDATE app_product SET price = 2 WHERE code ='0002'; Запросы с условиями (postgresql) UPDATE app_product SET price = (CASE WHEN code = '0001' THEN 3 WHEN code = '0002' THEN 2 ELSE 0 END); Шаг 4. Запросы с условиями
  • 12. Обычные запросы UPDATE app_product SET price = 3 WHERE code ='0001'; UPDATE app_product SET price = 2 WHERE code ='0002'; Запросы с условиями (postgresql) UPDATE app_product SET price = (CASE WHEN code = '0001' THEN 3 WHEN code = '0002' THEN 2 ELSE 0 END) WHERE code in ('0001','0002’); Шаг 4. Запросы с условиями
  • 13. Обновление одним запросом UPDATE app_product SET price = (CASE WHEN code = '0091' THEN 3 WHEN code = '0092' THEN 3 WHEN code = '0093' THEN 3 WHEN code = '0094' THEN 3 WHEN code = '0095' THEN 3 WHEN code = '0096' THEN 3 WHEN code = '0097' THEN 3 WHEN code = '0098' THEN 3 WHEN code = '0099' THEN 3 WHEN code = '0100' THEN 3 ELSE 0 END ) WHERE code in ('0091','0092','0093','0094','0095','0096','0097','0098','0099','0100'); Шаг 4. Запросы с условиями x2.5
  • 14. Шаг 5. Количество запросов
  • 15. 0 500 1000 1500 2000 2500 1 3 5 100 500 1000 2000 10000 Сколько объектов нужно обновлять в одном запросе? x30 Шаг 5. Количество запросов
  • 16. from django.db.models.fields import CharField from django.db.models.expressions import When, Case case = Case( When(code='0001', then=10), When(code='0002', then=15), default=0, output_field=CharField(), ) when_list = [When(code=line[0], then=line[1]) for line in lines] case = Case(*when_list, default=0, output_field=CharField()) Product.objects.update(price=case) Шаг 5. Django 1.8