Найти - Пользователи
Полная версия: Django ORM & SQLAlchemy - минимизация запросов
Начало » Базы данных » Django ORM & SQLAlchemy - минимизация запросов
1
paganmind
чтобы не придумывать примеры взял любой с нета

Пример 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 запрос и недревовидную коллекцию (таблицу) как результат, а не дерево элементов, которую сложно потом обрабатывать в шаблоне.

Можно хотя бы один из способов оптимизировать для минимизации запросов/преобразований в фреймворке?
Александр Кошелев
http://docs.djangoproject.com/en/dev/ref/models/querysets/#id4
paganmind
Daevaorn
http://docs.djangoproject.com/en/dev/ref/models/querysets/#id4
спасибо. действительно. недочитал документацию.
slav0nic
только надо поаккуретней был с релейтом, а то можно и полбазы вытянуть)
paganmind
slav0nic
только надо поаккуретней был с релейтом, а то можно и полбазы вытянуть)
К счастью, методу можно задавать глубину и поля по которым тянуть
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB