Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 12, 2009 17:10:19

paganmind
От:
Зарегистрирован: 2008-12-12
Сообщения: 56
Репутация: +  0  -
Профиль   Отправить e-mail  

Django ORM & SQLAlchemy - минимизация запросов

чтобы не придумывать примеры взял любой с нета

Пример 1. Django

from django.db import models

class Priority(models.Model):
name = models.CharField(max_length=100)

class Tasks(models.Model):
name = models.CharField(max_length=30)
description = models.CharField(max_length=40)
priority = models.ForeignKey(Priority)

tasks = Tasks.objects.all() #запрос
Выводим в шаблоне
{% for t in tasks %} 
name: {{t.name}}
description: {{t.description}}
priority: **{{t.priority.name}}** {# запрос #}
{% endfor %}
Итого: запрос 1 на все объекты + запрос на t.priority.name умноженный на количество объектов в Tasks

Это вместо 1 запроса

Теперь SQLAlchemy.

class User(Base):
__tablename__ = 'users'

id = Column(Integer, primary_key=True)
name = Column(String)
fullname = Column(String)
password = Column(String)

def __init__(self, name, fullname, password):
self.name = name
self.fullname = fullname
self.password = password

def __repr__(self):
return "<User('%s','%s', '%s')>" % (self.name, self.fullname, self.password)

class Address(Base):
__tablename__ = 'addr'
id = Column(Integer, primary_key=True)
email_address = Column(String, nullable=False)
user_id = Column(Integer, ForeignKey('users.id'))

user = relation(User, backref=backref('addr'))

def __init__(self, email_address):
self.email_address = email_address

def __repr__(self):
return "<Address('%s')>" % self.email_address
тоже их туториала. Немного не те таблицы. Можно пойти тем же методом и делать сотни запросов.

Можно вот так:
users = session.query(User, Address).select_from(join(User, Address)).all()
Итого имеем 1 запрос и недревовидную коллекцию (таблицу) как результат, а не дерево элементов, которую сложно потом обрабатывать в шаблоне.

Можно хотя бы один из способов оптимизировать для минимизации запросов/преобразований в фреймворке?



Отредактировано (Ноя. 12, 2009 17:29:26)

Офлайн

#2 Ноя. 12, 2009 22:16:49

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

Django ORM & SQLAlchemy - минимизация запросов

Офлайн

#3 Ноя. 12, 2009 22:24:24

paganmind
От:
Зарегистрирован: 2008-12-12
Сообщения: 56
Репутация: +  0  -
Профиль   Отправить e-mail  

Django ORM & SQLAlchemy - минимизация запросов

Daevaorn
http://docs.djangoproject.com/en/dev/ref/models/querysets/#id4
спасибо. действительно. недочитал документацию.



Офлайн

#4 Ноя. 13, 2009 12:10:57

slav0nic
Команда
От: dp.ua
Зарегистрирован: 2006-05-07
Сообщения: 2260
Репутация: +  41  -
Профиль   Отправить e-mail  

Django ORM & SQLAlchemy - минимизация запросов

только надо поаккуретней был с релейтом, а то можно и полбазы вытянуть)

Офлайн

#5 Ноя. 13, 2009 13:12:33

paganmind
От:
Зарегистрирован: 2008-12-12
Сообщения: 56
Репутация: +  0  -
Профиль   Отправить e-mail  

Django ORM & SQLAlchemy - минимизация запросов

slav0nic
только надо поаккуретней был с релейтом, а то можно и полбазы вытянуть)
К счастью, методу можно задавать глубину и поля по которым тянуть



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version