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
42
grpclib: pure-Python gRPC implementation
vmagamedov
0
500
Microservices / gRPC
vmagamedov
1
420
Other Decks in Programming
See All in Programming
速いWebフレームワークを作る
yusukebe
5
1.7k
AIでLINEスタンプを作ってみた
eycjur
1
230
CJK and Unicode From a PHP Committer
youkidearitai
PRO
0
110
「待たせ上手」なスケルトンスクリーン、 そのUXの裏側
teamlab
PRO
0
530
Improving my own Ruby thereafter
sisshiki1969
1
160
アルテニア コンサル/ITエンジニア向け 採用ピッチ資料
altenir
0
100
アプリの "かわいい" を支えるアニメーションツールRiveについて
uetyo
0
270
print("Hello, World")
eddie
2
530
時間軸から考えるTerraformを使う理由と留意点
fufuhu
16
4.8k
Android 16 × Jetpack Composeで縦書きテキストエディタを作ろう / Vertical Text Editor with Compose on Android 16
cc4966
1
220
MCPでVibe Working。そして、結局はContext Eng(略)/ Working with Vibe on MCP And Context Eng
rkaga
5
2.3k
ProxyによるWindow間RPC機構の構築
syumai
3
1.2k
Featured
See All Featured
Git: the NoSQL Database
bkeepers
PRO
431
66k
The Language of Interfaces
destraynor
161
25k
Reflections from 52 weeks, 52 projects
jeffersonlam
352
21k
The Pragmatic Product Professional
lauravandoore
36
6.9k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
51
5.6k
Optimising Largest Contentful Paint
csswizardry
37
3.4k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
188
55k
How STYLIGHT went responsive
nonsquared
100
5.8k
Visualization
eitanlees
148
16k
Music & Morning Musume
bryan
46
6.8k
Into the Great Unknown - MozCon
thekraken
40
2k
The Invisible Side of Design
smashingmag
301
51k
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