Взаимодействие с БД в Django. Object Relational...
Transcript of Взаимодействие с БД в Django. Object Relational...
Лабораторная работа №3
Взаимодействие с БД в Django.
Object Relational Mapping
Начнем
Лабораторная 3
Создадим проект:
Django-admin.py startproject booksdb
Настроим соединение с БД (settings.py): DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
'NAME': ‘mydb',
'USER': 'root', # Not used with sqlite3.
'PASSWORD': '1q2w3e', # Not used with sqlite3.
'HOST': '', # Set to empty string for localhost. Not used with sqlite3.
'PORT': '', # Set to empty string for default. Not used with sqlite3.
}
}
Первое соединение с базой
Лабораторная 3
В каталоге проекта запустим оболочку Python:
python manage.py shell
В ней попробуем соединиться с базой :
from django.db import connection
cursor = connection.cursor()
Первое приложение
Лабораторная 3
В каталоге проекта вызовем команду:
python manage.py startapp books
Результат:
books/
__init__.py
models.py
views.py
Первая модель
Лабораторная 3
Models.py:
from django.db import models
class Publisher(models.Model):
name = models.CharField(max_length=30)
address = models.CharField(max_length=50)
city = models.CharField(max_length=60)
state_province = models.CharField(max_length=30)
country = models.CharField(max_length=50)
website = models.URLField()
Первая модель
Лабораторная 3
Models.py:
class Author(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=40)
email = models.EmailField()
Первая модель
Лабораторная 3
Models.py:
class Book(models.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher)
publication_date = models.DateField()
Установка модели
Лабораторная 3
settings.py: INSTALLED_APPS = (
#'django.contrib.auth',
#'django.contrib.contenttypes',
#'django.contrib.sessions',
#'django.contrib.sites',
#'django.contrib.messages',
#'django.contrib.staticfiles',
'bookdb.books',
}
python manage.py validate – проверка синтаксиса
python manage.py sqlall books – запуск генерации SQL запросов
Python manage.py syncdb – выполнение запросов
Доступ к данным
Лабораторная 3
python manage.py shell
from books.models import Publisher
p1 = Publisher(name='Addison-Wesley', address='75 Arlington Street', city='Boston', state_province='MA', country='U.S.A.', website='http://www.apress.com/')
p1.save()
p2 = Publisher(name="O'Reilly", address='10 Fawcett St.', city='Cambridge', state_province='MA', country='U.S.A.', website='http://www.oreilly.com/')
p2.save()
publisher_list = Publisher.objects.all()
publisher_list
Строковое представление модели
Лабораторная 3
Добавим следующие строки в Models.py
Class Publisher:
def __unicode__(self):
return self.name
class Author:
def __unicode__(self):
return '%s %s' % (self.first_name, self.last_name)
class Book:
def __unicode__(self):
return self.title
Результат: publisher_list = Publisher.objects.all()
[<Publisher: Addison-Wesley>, <Publisher: O'Reilly>]
Изменение данных
Лабораторная 3
• Создадим новый объект:
• p = Publisher(name='Apress', address='2855 Telegraph Ave.', city='Berkeley', state_province='CA', country='U.S.A.', website='http://www.apress.com/')
• p.save()
• Получим id сохраненного объекта: p.id
• Присвоим новое значение: p.name = 'Apress Publishing'
p.save()
Селекция данных
Лабораторная 3
• Publisher.objects.all() : SELECT id, name, address, city, state_province, country, website FROM book_publisher;
• Publisher.objects.filter(name='Apress') : SELECT id, name, address, city, state_province, country, website FROM books_publisher WHERE name = 'Apress';
• Publisher.objects.filter(name__contains="press") : SELECT id, name, address, city, state_province, country, website FROM books_publisher WHERE name LIKE '%press%';
• Один объект: Publisher.objects.get(name="Apress")
• Сортировка: Publisher.objects.order_by("name")
• Цепочка запросов: Publisher.objects.filter(country="U.S.A.").order_by("-name")
• Изменение мн-ва объектов одним запросом:
p = Publisher.objects.get(name='Apress')
p.name=“Apress Publishing”
p.save()
Удаление данных
Лабораторная 3
• Определенный объект: p=Publisher.objects.get(name="O'Reilly")
p.delete()
• Выборка: Publisher.objects.filter(country='USA').delete()
• Все: Publisher.objects.all().delete()