Работа с базой.
Django ORM
СергейЛихобабин
Техносфера.2014
Где хранить данные
На клиенте
Cookie (4кб)
Web Storage
На сервере
В памяти
На диске
На диске и в памяти
Работа с базой
Представление о СУБД
Проектирование БД
Основные операции SQL
Работа с БДв Python
Работа с БДв Django
БД
Взаимосвязанные даные специальным образом
хранящиеся на каком-либо носителе
СУБД
Программный комплекс обеспечивающий работу с
данными в БД
Функции СУБД
Управление данными на дисках и в
оперативной памяти
Журнализация, резервное копирование
Реляционная модель
данных
Таблица -отношение, relation
Строка -кортеж, tuple
Столбец -атрибут, column
Реляционная модель
данных
Реляционная модель
данных
Задачи проектирования
Обеспечение хранения всей необходимой
информации
Обеспечение возможности получения данных
по всем запросам
Сокращение избыточности и дублирования
данных
Обеспечение целостности данных
Проектирование на
практике
Логическое разделение сущностей
Выделение первичных ключей
Связи 1:Nреализуются через внешний ключ
Связи N:M реализуются через промежуточную
таблицу
Аттрибут с фиксированным числом значений -
внешняя таблица либо enum
Основные операции SQL
SELECT
ELECT*FROMusersWHEREage>10;
ELECT*FROMusersWHEREname='masha';
ELECTMAX(age)FROMusers;
ELECTid,name,LENGTH(name)ASlen
ROMusers
HEREemailLIKE'%@mail.ru'ANDage>10
RDERBYnameDESC
IMIT10OFFSET15;
Агрегатные функции
COUNT, SUM, AVG, GROUP
ELECTname,count(id)cnt
ROMusers
ROUPBYname
RDERBYcnt
AVINGcnt>1
Join
ELECTh.name,a.name
ROMheroesh,abilitiesa
HEREh.id=a.hero_id;
ELECTh.name,a.name
ROMheroesh
NNERJOINabilitiesaONh.id=a.hero_id;
ELECTh.name,a.name
ROMheroesh
EFTJOINabilitiesaONh.id=a.hero_id;
Вложенные запросы
ELECTtitle
ROMarticlet1
OIN(
SELECTrubric_id,MAX(id)max_id
FROMarticle
GROUPBYrubric_idLIMIT5
t2
t1.id=t2.max_id;
INSERT, UPDATE, DELETE
NSERTINTOusers(name,age)VALUES('Petr',10);
PDATEusersSETage=20WHEREname='Petr';
PDATEusersSETrating=rating+1;
ELETEFROMusersWHEREname='Masha';
ELETEFROMusersWHEREage>150;
Индексы
Индексы на практике
Индексы для полей, по которым происходит
JOIN
Индексы для полей, по которым фильтруются
записи
Индексы для полей, по которым идет
сортировка
Проверять план выполнения запроса EXPLAIN
Управление оптимизатором запросов
Работа с БД в python
MySQLdb
mportMySQLdb
b=MySQLdb.connect(
host="localhost",user="bob",
passwd="secret",db="goodies"
ursor=db.cursor()
MySQLdb
ursor.execute(
'updateuserssetage=age+1wherename=%s',(name,)
ursor.execute('select*fromusers')
sers=cursor.fetchall()
ursor.execute(
'select*fromuserswherename=%s',(name,)
ser=cursor.fetchone()
MySQLdb
ursor.executemany(
"INSERTINTOusers(name,age)VALUES(%s,%s)",
[
("Igor",18),
("Petr",16),
("Dasha",17)
]
b.close()
Плейсхолдеры
mail="'OR'1'='1"
ursor.execute(
"SELECT*FROMusersWHEREemail='%s'"%email
Работа с БД в django
Классы в python
lassEmployee(object):
def__init__(self,name,salary):
self.name=name
self.salary=salary
defget_info(self):
return"Name:%s,Salary:%s"%(self.name,self.sal
lassProgrammer(Employee):
def__init__(self,name,salary,lang):
super(Programmer,self).__init__(name,salary)
self.lang=lang
Классы в python
>>e1=Programmer(u'Vasya',100,'VB')
>>printu'Welcome%s'%e1
elcomeVasya
>>e1.get_info()
'Name:Vasya,Salary:100'
>>e1.lang
VB'
Raw SQL vs ORM
ursor.execute('select*fromuserswhereage>18')
oruserincursor.fetchall():
pk,name,age=user
printname
VS
oruserinUser.objects.filter(age__gt=18):
printuser.name
Модели и типы данных
lassPost(models.Model):
title=models.CharField(max_length=255)
content=models.TextField()
creation_date=models.DateTimeField(
default=datetime.datetime.now
)
def__unicode__(self):
returnself.title
defget_absolute_url(self):
return'/post/%d/'%self.pk
classMeta:
ordering=['-creation_date’]
Модели и типы данных
Связи между таблицами
lassPost(models.Model):
title=models.CharField(max_length=255)
content=models.TextField()
creation_date=models.DateTimeField(
default=datetime.datetime.now
)
category=models.ForeignKey(
Category,on_delete=models.SET_NULL
)
tags=models.ManyToManyField(Tag)
ForeignKey, OneToOne
ForeignKey= IntegerField + Constraint
OneToOneField = ForeignKey+ unique
post.categoryVS post.category_id
Обратная связь -category.post_set
ForeignKey, OneToOne
Реакция на удаление внешнего ключа
RESTRICT-> models.PROTECT
CASCADE -> models.CASCADE
SETNULL -> models.SET_NULL
NO ACTION-> models.DO_NOTHING
ManyToManyField
post.tags -related manager
Обратная связь -tag.post_set
ORM API
ythonmanage.pyshell
>>fromblog.modelsimportCategory,Post
>>fromdjango.dbimportconnection
>>#Вставкаизамена
>>c=Category(title="Python")
>>c.save()
>>c.id
>>c.title="AboutPython"
>>c.save()
ORM API
>>print'n'.join(q['sql']forqinconnection.queries)
NSERTINTO`blog_category`(`title`,
description`)VALUES('Python','')
ELECT(1)AS`a`FROM`blog_category`WHERE
blog_category`.`id`=1LIMIT1
PDATE`blog_category`SET`title`='About
ython',`description`=''WHERE
blog_category`.`id`=1
ORM API
>>Category.objects.all()
<Category:AboutPython>]
>>printCategory.objects.all().query
ELECT`blog_category`.`id`,
blog_category`.`title`,
blog_category`.`description`FROM`blog_category`
>>Category.objects.filter(id=1)
<Category:AboutPython>]
>>c=Category.objects.get(id=1)
>>c
Category:AboutPython>
>>c.post_set.all()
ORM API
>>c.post_set.create(title="Newpost",content="Manywords")
Post:Newpost>
>>c.post_set.count()
>>p=Post.objects.get(title="Newpost")
>>p.category
Category:AboutPython>
>>p.category_id
>>Post.objects.filter(category__title="AboutPython")
Post:Newpost>
>>c.delete()
Debug Toolbar
https://github.com/django-debug-
toolbar/django-debug-toolbar
Manager
slice [10:20]
.all(), .filter(), exclude(), .order_by()
.values(), .values_list()
.get(), .get_or_create(), .count(), .exists()
.select_related(), prefetch_related()
.update(), .delete()
RelatedManager
.create(**kwargs)
.add(obj1[, obj2, ...])
.remove(obj1[, obj2, ...])
.clear()
Ленивое выполнение
QuerySet
s=Category.objects.all()
notuser.is_admin:
qs=qs.filter(active=True)
rintqs.count()
Избегайте лишних
запросов в базу
Foreign keyкэшируется
ost.category
Queryset-нет
uestion_list=list(Question.objects.all())
Атомарное обновление
QuerySet
uestion.objects.filter(pk=10)
update(rating=models.F('rating')+1)
Полезные команды
Проверка моделей
ythonmanage.pyvalidate
Вывод SQL
ythonmanage.pysqlall<app_name>
</app_name>
Выполнение SQL в базе
ythonmanage.pysyncdb
Миграции
DROP DATABASE, CREATE DATABASE
DROP TABLE, CREATE TABLE
ALTERTABLE
South
South
Автоматическое создание миграций
Поддержка различных СУБД
Прямые и обратные миграции
Инициализация South
1. Создать миграцию
2. Применить миграцию
./manage.pyschemamigrationask--initial
./manage.pymigrateask
Миграция с South
1. Изменить модель
2. Создать миграцию
3. Применить миграцию
./manage.pyschemamigrationask--auto
/manage.pymigrateask
Полезные ссылки
MySQL
http://dev.mysql.com/doc/refman/5.5/en/index.html
Mysqldb http://mysql-
python.sourceforge.net/MySQLdb.html
Django http://docs.djangoproject.com/en/dev/
Django DebugToolbar https://github.com/django-
debug-toolbar/django-debug-toolbar
Спасибо за внимание
СергейЛихобабин
s.lihobabin@corp.mail.ru

More Related Content

PDF
Типовое внедрение 1С:Документооборот (вебинар Первый БИТ, январь 2014)
PPTX
10 субд
PPTX
презентация 1с документооборот
PPTX
MongoDB первые впечатления
PDF
Обзор возможностей программы 1С:Документооборот 8
PPT
Возможности 1С Документооборот 8
Типовое внедрение 1С:Документооборот (вебинар Первый БИТ, январь 2014)
10 субд
презентация 1с документооборот
MongoDB первые впечатления
Обзор возможностей программы 1С:Документооборот 8
Возможности 1С Документооборот 8

What's hot (12)

PPTX
MongoDB. Области применения, преимущества и узкие места, тонкости использован...
PDF
кбнти
PPTX
Презентация "1С:Документооборот на интерфейсе ТАКСИ – легкое решение"
PPT
Возможности 1С Документооборот 8
PDF
1C:Документооборот 8
KEY
Ссылки в нормативных документах
PPTX
MongoDB в продакшен - миф или реальность?
ODP
Кратко о MongoDB
PDF
Android - 12 - Data types
PPT
DBD lection 1. Intro in Database Design. In Russian.
PDF
Не SQL'ем единым
PPTX
Презентация 1С:Документооборот 8
MongoDB. Области применения, преимущества и узкие места, тонкости использован...
кбнти
Презентация "1С:Документооборот на интерфейсе ТАКСИ – легкое решение"
Возможности 1С Документооборот 8
1C:Документооборот 8
Ссылки в нормативных документах
MongoDB в продакшен - миф или реальность?
Кратко о MongoDB
Android - 12 - Data types
DBD lection 1. Intro in Database Design. In Russian.
Не SQL'ем единым
Презентация 1С:Документооборот 8
Ad

Viewers also liked (20)

PDF
Л8 Django. Дополнительные темы
PDF
Лекция 5 Серверная разработка
PDF
Webdev7 (2)
PDF
L4: Решающие деревья
PDF
L8: Л7 Em-алгоритм
PDF
Мастер-класс: "Интеграция в промышленную разработку"
PDF
L6: Метод опорных векторов
PDF
Webdev7: Обработка HTTP запросов. Django Views
PDF
Л9: Взаимодействие веб-приложений
PDF
L5: Л5 Байесовские алгоритмы
PDF
Мастер-класс: Особенности создания продукта для мобильного веб
PDF
Web лекция 1
PDF
L10: Алгоритмы кластеризации
PDF
L1 Вводная лекция. Обзор основных задач Data Science (Лекция №1)
PDF
L3: Линейная и логистическая регрессия
PDF
L13: Заключительная
PDF
L7:Задача кластеризации. Метрики качества
PDF
Лекция №12 "Ограниченная машина Больцмана"
PDF
L11: Метод ансамблей
PDF
L2: Задача классификации и регрессии. Метрики ошибок
Л8 Django. Дополнительные темы
Лекция 5 Серверная разработка
Webdev7 (2)
L4: Решающие деревья
L8: Л7 Em-алгоритм
Мастер-класс: "Интеграция в промышленную разработку"
L6: Метод опорных векторов
Webdev7: Обработка HTTP запросов. Django Views
Л9: Взаимодействие веб-приложений
L5: Л5 Байесовские алгоритмы
Мастер-класс: Особенности создания продукта для мобильного веб
Web лекция 1
L10: Алгоритмы кластеризации
L1 Вводная лекция. Обзор основных задач Data Science (Лекция №1)
L3: Линейная и логистическая регрессия
L13: Заключительная
L7:Задача кластеризации. Метрики качества
Лекция №12 "Ограниченная машина Больцмана"
L11: Метод ансамблей
L2: Задача классификации и регрессии. Метрики ошибок
Ad

More from Technosphere1 (12)

PDF
Лекция №10 "Алгоритмические композиции. Завершение"
PDF
Лекция №13 "Глубокие нейронные сети"
PDF
Лекция №11 "Основы нейронных сетей"
PDF
Лекция №9 "Алгоритмические композиции. Начало"
PDF
Лекция №8 "Методы снижения размерности пространства"
PDF
Лекция №7 "Машина опорных векторов"
PDF
Лекция №6 "Линейные модели для классификации и регрессии"
PDF
Лекция №5 "Обработка текстов, Naive Bayes"
PDF
Лекция №4 "Задача классификации"
PDF
Лекция №2 "Задача кластеризации и ЕМ-алгоритм"
PDF
Лекция №1 "Задачи Data Mining"
PDF
Лекция №3 "Различные алгоритмы кластеризации"
Лекция №10 "Алгоритмические композиции. Завершение"
Лекция №13 "Глубокие нейронные сети"
Лекция №11 "Основы нейронных сетей"
Лекция №9 "Алгоритмические композиции. Начало"
Лекция №8 "Методы снижения размерности пространства"
Лекция №7 "Машина опорных векторов"
Лекция №6 "Линейные модели для классификации и регрессии"
Лекция №5 "Обработка текстов, Naive Bayes"
Лекция №4 "Задача классификации"
Лекция №2 "Задача кластеризации и ЕМ-алгоритм"
Лекция №1 "Задачи Data Mining"
Лекция №3 "Различные алгоритмы кластеризации"

Лекция 6: Работа с данными. Django ORM