Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
High Performance SQLAlchemy
Search
Vladimir Magamedov
November 01, 2014
Programming
5
890
High Performance SQLAlchemy
PyCon Ukraine 2014
Vladimir Magamedov
November 01, 2014
Tweet
Share
More Decks by Vladimir Magamedov
See All by Vladimir Magamedov
Microservices
vmagamedov
0
45
grpclib: pure-Python gRPC implementation
vmagamedov
0
530
Microservices / gRPC
vmagamedov
1
420
Other Decks in Programming
See All in Programming
モジュラモノリスにおける境界をGoのinternalパッケージで守る
magavel
0
3.5k
Unity6.3 AudioUpdate
cova8bitdots
0
130
OTP を自動で入力する裏技
megabitsenmzq
0
110
AIに任せる範囲を安全に広げるためにやっていること
fukucheee
0
130
What Spring Developers Should Know About Jakarta EE
ivargrimstad
0
310
Go Conference mini in Sendai 2026 : Goに新機能を提案し実装されるまでのフロー徹底解説
yamatoya
0
590
コードレビューをしない選択 #でぃーぷらすトウキョウ
kajitack
3
960
S3ストレージクラスの「見える」「ある」「使える」は全部違う ─ 体験から見た、仕様の深淵を覗く
ya_ma23
0
540
オブザーバビリティ駆動開発って実際どうなの?
yohfee
3
850
ベクトル検索のフィルタを用いた機械学習モデルとの統合 / python-meetup-fukuoka-06-vector-attr
monochromegane
2
440
Rで始めるML・LLM活用入門
wakamatsu_takumu
0
180
Claude Code の Skill で複雑な既存仕様をすっきり整理しよう
yuichirokato
1
380
Featured
See All Featured
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
200
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.2k
First, design no harm
axbom
PRO
2
1.1k
Building Adaptive Systems
keathley
44
3k
Building Applications with DynamoDB
mza
96
7k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.2k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
150
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
72
How GitHub (no longer) Works
holman
316
140k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
71
Transcript
High Performance SQLAlchemy Vladimir Magamedov @vmagamedov
Как выполнять работу быстре? 1. Не делать ничего лишнего ◦
Не загружать лишние данные ◦ joinedload, subqueryload ◦ Не использовать ORM объекты
Как выполнять работу быстре? 1. Не делать ничего лишнего 2.
Оптимизировать оставшееся
Как оптимизировать оставшееся? 1. Профилировать – борьба со следствием
Как оптимизировать оставшееся? 1. Профилировать – борьба со следствием 2.
Писать простой код – исправить причину
Как влияет простота кода на его эффективность? 1. Решение любой
задачи зависит от того, как мы на неё смотрим 2. Простой код облегчает изменение кода
Признаки сложного кода? Условия (if..else) 1. Наделяют код умом 2.
Логика распределяется по всему приложению
Признаки сложного кода? Условия (if..else) 1. Наделяют код умом 2.
Логика распределяется по всему приложению Решение: выносить логику как можно выше, концентрировать в одном месте
Признаки сложного кода? Универсальные функции – Функции, выполняющие более одной
задачи
Признаки сложного кода? Универсальные функции – Функции, выполняющие более одной
задачи Решение: как можно большая часть функций должна выполнять одну задачу
Признаки сложного кода? Избыточные аргументы 1. Чаще всего это ORM
объекты 2. Ещё хуже когда обращаются к связанным объектам, например: product.company.owner.contacts.phone
Признаки сложного кода? Избыточные аргументы 1. Чаще всего это ORM
объекты 2. Ещё хуже когда обращаются к связанным объектам Решение: принцип "Бритвы Оккама"
Признаки сложного кода? Неявные запросы Routing View Template Helpers queries
queries queries
Признаки сложного кода? Неявные запросы 1. Спрятанные запросы внутрь функций
◦ снаружи на них никак нельзя повлиять
Признаки сложного кода? Неявные запросы 1. Спрятанные запросы внутрь функций
2. Ленивая загрузка колонок и объектов ◦ ведет к проблеме N+1 запросов
Признаки сложного кода? Неявные запросы 1. Спрятанные запросы внутрь функций
2. Ленивая загрузка колонок и объектов Решение: запросы как и логику надо выносить как можно выше, чтобы иметь возможность ими управлять
Вывод 1. Использовать только необходимое 2. Бо́льшая часть простых функций,
выполняющих одну задачу 3. Концентрировать логику и запросы в одном месте
Вывод 1. Использовать только необходимое 2. Бо́льшая часть простых функций,
выполняющих одну задачу 3. Концентрировать логику и запросы в одном месте Решение: SQLConstruct
SQLConstruct Декларативный способ описания запросов…
SQLConstruct Декларативный способ описания запросов… … позволяющий описать что мы
хотим получить из базы данных…
SQLConstruct Декларативный способ описания запросов… … позволяющий описать что мы
хотим получить из базы данных… … и как эти данные преобразовать в удобный для использования вид.
Пример query = ConstructQuery( # аналог session.query() { "id": User.id,
# название атрибута "name": User.name, # вычисляемое значение }, db.session, # scoped session ) # результат запроса [Object({"id": 1, "name": "Guido"}), Object({"id": 2, "name": "Barry"})]
apply_ query = ConstructQuery( { "id": User.id, "name": apply_(string.upper, #
функция [User.name]), # аргументы }, db.session, ) [Object({"id": 1, "name": "GUIDO"}), Object({"id": 2, "name": "BARRY"})]
if_ { "text": Comment.text, "author": if_(Comment.user_id, then_=User.name, else_="Anonymous"), }
define query = ( ConstructQuery( { "name": User.name, "photo": apply_(url_for_photo,
[Photo.id, Photo.name]), }, db.session, ) .join(User.photo) )
define @define def url_for_photo(photo) def body(photo_id, photo_name): return url_for('photo', id=photo_id,
slug=slugify(photo_name)) return body, [photo.id, photo.name]
define # в описании результата url_for_photo.defn(Photo) # объектная форма url_for_photo(photo)
# функциональная форма url_for_photo.func(photo.id, photo.name)
define query = ( ConstructQuery( { "name": User.name, "photo": url_for_photo.defn(Photo),
}, db.session, ) .join(User.photo) )
get_ query = ConstructQuery( { "name": User.name, "photo": get_(url_for_photo.defn(Photo), User.photo),
# relationship }, db.session, )
map_ query = ConstructQuery( { "name": Product.name, "photos": map_(url_for_photo.defn(Photo), Product.photos),
}, db.session, )
Вопросы? github:vmagamedov/sqlconstruct