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
20260228_JAWS_Beginner_Kansai
takuyay0ne
5
600
条件判定に名前、つけてますか? #phperkaigi #c
77web
2
470
AI 開発合宿を通して得た学び
niftycorp
PRO
0
160
AIコードレビューの導入・運用と AI駆動開発における「AI4QA」の取り組みについて
hagevvashi
0
510
DevinとClaude Code、SREの現場で使い倒してみた件
karia
1
1.1k
クライアントワークでSREをするということ。あるいは事業会社におけるSREと同じこと・違うこと
nnaka2992
1
350
Go Conference mini in Sendai 2026 : Goに新機能を提案し実装されるまでのフロー徹底解説
yamatoya
0
620
ロボットのための工場に灯りは要らない
watany
11
3k
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
820
Takumiから考えるSecurity_Maturity_Model.pdf
gessy0129
1
150
モックわからないマン卒業記 ~振る舞いを起点に見直した、フロントエンドテストにおけるモックの使いどころ~
tasukuwatanabe
3
410
Rで始めるML・LLM活用入門
wakamatsu_takumu
0
190
Featured
See All Featured
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
210
Google's AI Overviews - The New Search
badams
0
940
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
1
320
Product Roadmaps are Hard
iamctodd
PRO
55
12k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
75
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
410
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.2k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3.4k
Tell your own story through comics
letsgokoyo
1
850
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.8k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.7k
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