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
880
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
42
grpclib: pure-Python gRPC implementation
vmagamedov
0
490
Microservices / gRPC
vmagamedov
1
420
Other Decks in Programming
See All in Programming
Development of an App for Intuitive AI Learning - Blockly Summit 2025
teba_eleven
0
110
Perplexity Slack Botを作ってAI活用を進めた話 / AI Engineering Summit プレイベント
n3xem
0
640
Java on Azure で LangGraph!
kohei3110
0
110
[初登壇@jAZUG]アプリ開発者が気になるGoogleCloud/Azure+wasm/wasi
asaringo
0
130
F#で自在につくる静的ブログサイト - 関数型まつり2025
pizzacat83
0
290
AIエージェントによるテストフレームワーク Arbigent
takahirom
0
370
Webからモバイルへ Vue.js × Capacitor 活用事例
naokihaba
0
540
事業戦略を理解してソフトウェアを設計する
masuda220
PRO
21
5.9k
つよそうにふるまい、つよい成果を出すのなら、つよいのかもしれない
irof
1
280
社内での開発コミュニティ活動とモジュラーモノリス標準化事例のご紹介/xPalette and Introduction of Modular monolith standardization
m4maruyama
0
120
「ElixirでIoT!!」のこれまでとこれから
takasehideki
0
350
XSLTで作るBrainfuck処理系
makki_d
0
190
Featured
See All Featured
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
8
780
StorybookのUI Testing Handbookを読んだ
zakiyama
30
5.8k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
35
2.3k
The Pragmatic Product Professional
lauravandoore
35
6.7k
A designer walks into a library…
pauljervisheath
206
24k
Code Reviewing Like a Champion
maltzj
524
40k
GraphQLの誤解/rethinking-graphql
sonatard
71
11k
Agile that works and the tools we love
rasmusluckow
329
21k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
233
17k
Building a Scalable Design System with Sketch
lauravandoore
462
33k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
657
60k
Measuring & Analyzing Core Web Vitals
bluesmoon
7
480
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