2. Где хранить данные
На клиенте
• Cookie (до 4Кб)
• HTML5 Web Storage (до 5Мб)
На сервере
• В памяти
• На диске
• На диске и в памяти
2
3. Работа с базой
1. Представление о СУБД
2. Проектирование баз данных
3. Основные операции SQL
4. Работа с базами данных в python
5. Работа с базами данных в django
3
4. Представление о СУБД
База данных
взаимосвязанная информация (данные) об
объектах, которая организованна специальным
образом и хранится на каком-либо носителе.
СУБД
совокупность программных и лингвистических
средств общего или специального назначения,
обеспечивающих управление созданием и
использованием баз данных.
4
5. Представление о СУБД
Функции СУБД
управление данными на дисках и в оперативной памяти
журнализация изменений, резервное копирование и
восстановление базы данных после сбоев;
поддержка языков БД (язык определения данных, язык
манипулирования данными).
5
6. Реляционная модель данных
Таблица – отношение, relation
Строка – кортеж, tuple
Столбец – атрибут, column
Car
Key
1
2
3
Model
Toyota Camry
Audi A4
Honda Civic
Color
Key
1
2
Color
1
2
2
Name
Black
Pink
Year
2010
2013
2013
6
8. Реляционная модель данных
Задачи проектирования
Обеспечение хранения в БД всей необходимой информации.
Обеспечение возможности получения данных по всем
необходимым запросам.
Сокращение избыточности и дублирования данных.
Обеспечение целостности данных (правильности их
содержания): исключение противоречий в содержании данных,
исключение их потери и т.д.
8
9. Реляционная модель данных
Проектирование на практике
Логическое разделение сущностей
Выделение синтетических первичных ключей
Связи 1:N, N:1 реализуются через внешний ключ
Связи N:M реализуются через промежуточную таблицу
Атрибут с фиксированным числом значений – внешняя
таблица либо поле типа enum
9
11. SELECT
SELECT * FROM users WHERE age > 10;
SELECT * FROM users WHERE name = 'masha';
SELECT max(age) FROM users;
SELECT id, name, length(name) AS len
FROM users
WHERE email LIKE '%@mail.ru' AND age > 10
ORDER BY name DESC
LIMIT 10 OFFSET 15
11
13. SELECT. JOIN
SELECT h.name, a.name
FROM heroes h, abilities a
WHERE h.id = a.hero_id
SELECT h.name, a.name
FROM heroes h
INNER JOIN abilities a ON h.id = a.hero_id
SELECT h.name, a.name
FROM heroes h
LEFT JOIN abilities a ON h.id = a.hero_id
13
14. SELECT. Вложенные запросы
SELECT title
FROM article t1
JOIN (
SELECT rubric_id, MAX(id) max_id
FROM article
GROUP BY rubric_id LIMIT 5
) t2
ON t1.id = t2.max_id;
14
15. INSERT, UPDATE, DELETE
INSERT INTO users (name, age) VALUES ('Petr', 10);
UPDATE users SET age = 20 WHERE name = 'Petr';
UPDATE users SET rating = rating + 1;
DELETE FROM users WHERE name = 'Masha';
DELETE FROM users WHERE age > 150;
15
16. Индексы
Проектирование на практике
Создавать индексы для полей, по которым происходит JOIN
Создавать индексы для полей, по которым фильтруются
записи (WHERE)
Создавать индексы для полей, по которым идет сортировка
(ORDER)
Проверять план выполнения запроса (EXPLAIN)
Управление оптимизатором (принудительное использование
индекса, порядок соединения таблиц)
16
19. MySQLdb
cursor.execute('update users set age = age + 1
where name = %s', (name,))
cursor.execute('select * from users')
users = cursor.fetchall()
cursor.execute('select * from users where name =
%s', (name,))
user = cursor.fetchone()
19
25. Raw SQL vs ORM
cursor.execute('select * from users where age >
18')
for user in cursor.fetchall():
pk, name, age = user
print name
VS
for user in User.objects.filter(age__gt=18):
print user.name
25
26. Модели и типы данных
class Post(models.Model):
title = models.CharField(max_length=255)
content = models.TextField()
creation_date =
models.DateTimeField(default=datetime.datetime.now)
def __unicode__(self):
return self.title
def get_absolute_url(self):
return '/post/%d/' % self.pk
def get_next_post(self):
"""Return the next entry"""
class Meta:
ordering = ['-creation_date’]
26
27. Модели и типы данных
Типы данных Mysql
varchar(N)
longtext
tinyint(1)
int(11)
smallint(5) unsigned
date
datetime
Типы полей Django
CharField
EmailField
SlugField
ImageField
TextField
BooleanField
IntegerField
PositiveSmallIntegerField
DateField
DateTimeField
27
28. Модели и типы данных
Свойства полей моделей
null, blank, choices, db_index, default, editable,
help_text, max_length, primary_key, unique, unique_for_date,
unique_for_month, unique_for_year, verbose_name
https://docs.djangoproject.com/en/dev/ref/models/fields/
28
29. Связи между таблицами
class Post(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)
29
30. Связи между таблицами
ForeignKey, OneToOneField
ForeignKey = IntegerField + Constraint
OneToOneField = ForeignKey + unique
post.category – связанный объект (отдельный запрос к
связанной сущности)
post.category_id – значение атрибута модели (просто id)
В обратную сторону:
category.post_set.all()
30
31. Связи между таблицами
ForeignKey, OneToOneField
Изменение/удаление внешнего ключа
•
•
•
•
RESTRICT -> models.PROTECT
CASCADE -> models.CASCADE
SET NULL -> models.SET_NULL
NO ACTION -> models.DO_NOTHING
31
42. Особенности QuerySet
Избегайте лишних запросов в базу
Foreign key кешируется
post.category
Queryset – нет.
Если нужно использовать несколько раз – кешируйте явно
question_list = list(Question.objects.all())
42
44. Создание базы
CREATE DATABASE ask_db CHARACTER SET utf8
COLLATE utf8_general_ci;
GRANT ALL PRIVILEGES ON ask_db.* TO
ask_user@localhost identified BY 'secret';
44
46. Полезные команды
Проверка моделей
python manage.py validate
Вывод SQL
python manage.py sqlall <app_name>
Выполнение SQL в базе
python manage.py syncdb
46
47. SQL. Создание таблиц
CREATE TABLE `blog_post` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`title` varchar(255) NOT NULL,
`content` longtext NOT NULL,
`creation_date` datetime NOT NULL,
`category_id` integer NOT NULL
)
;
ALTER TABLE `blog_post` ADD CONSTRAINT
`category_id_refs_id_e0428883` FOREIGN KEY
(`category_id`) REFERENCES `blog_category` (`id`);
ALTER TABLE `blog_post_tags` ADD CONSTRAINT
`post_id_refs_id_c9e37cca` FOREIGN KEY (`post_id`)
REFERENCES `blog_post` (`id`);
CREATE INDEX `blog_post_42dc49bc` ON `blog_post`
(`category_id`);
47
48. SQL. Удаление и изменение таблиц
DROP TABLE blog_post;
ALTER TABLE users ADD COLUMN language
enum('ru', 'en') NOT NULL DEFAULT 'ru' after
name;
ALTER TABLE users DROP COLUMN langauge;
ALTER TABLE users ADD INDEX ('name');
ALTER TABLE users CHANGE nickname fullname
varchar(255) NOT NULL;
48
53. 1. Установить Django Debug Toolbar
2. Установить MySQL, python-mysqldb. Создать базу данных и
пользователя для работы с базой
3. Описать модели для проекта «Вопросы и ответы»
4. Наполнить базу тестовыми данными
53