Upgrade to Pro — share decks privately, control downloads, hide ads and more …

High Performance SQLAlchemy

High Performance SQLAlchemy

PyCon Ukraine 2014

Vladimir Magamedov

November 01, 2014
Tweet

More Decks by Vladimir Magamedov

Other Decks in Programming

Transcript

  1. Как выполнять работу быстре? 1. Не делать ничего лишнего ◦

    Не загружать лишние данные ◦ joinedload, subqueryload ◦ Не использовать ORM объекты
  2. Как влияет простота кода на его эффективность? 1. Решение любой

    задачи зависит от того, как мы на неё смотрим 2. Простой код облегчает изменение кода
  3. Признаки сложного кода? Условия (if..else) 1. Наделяют код умом 2.

    Логика распределяется по всему приложению
  4. Признаки сложного кода? Условия (if..else) 1. Наделяют код умом 2.

    Логика распределяется по всему приложению Решение: выносить логику как можно выше, концентрировать в одном месте
  5. Признаки сложного кода? Универсальные функции – Функции, выполняющие более одной

    задачи Решение: как можно большая часть функций должна выполнять одну задачу
  6. Признаки сложного кода? Избыточные аргументы 1. Чаще всего это ORM

    объекты 2. Ещё хуже когда обращаются к связанным объектам, например: product.company.owner.contacts.phone
  7. Признаки сложного кода? Избыточные аргументы 1. Чаще всего это ORM

    объекты 2. Ещё хуже когда обращаются к связанным объектам Решение: принцип "Бритвы Оккама"
  8. Признаки сложного кода? Неявные запросы 1. Спрятанные запросы внутрь функций

    2. Ленивая загрузка колонок и объектов ◦ ведет к проблеме N+1 запросов
  9. Признаки сложного кода? Неявные запросы 1. Спрятанные запросы внутрь функций

    2. Ленивая загрузка колонок и объектов Решение: запросы как и логику надо выносить как можно выше, чтобы иметь возможность ими управлять
  10. Вывод 1. Использовать только необходимое 2. Бо́льшая часть простых функций,

    выполняющих одну задачу 3. Концентрировать логику и запросы в одном месте
  11. Вывод 1. Использовать только необходимое 2. Бо́льшая часть простых функций,

    выполняющих одну задачу 3. Концентрировать логику и запросы в одном месте Решение: SQLConstruct
  12. SQLConstruct Декларативный способ описания запросов… … позволяющий описать что мы

    хотим получить из базы данных… … и как эти данные преобразовать в удобный для использования вид.
  13. Пример query = ConstructQuery( # аналог session.query() { "id": User.id,

    # название атрибута "name": User.name, # вычисляемое значение }, db.session, # scoped session ) # результат запроса [Object({"id": 1, "name": "Guido"}), Object({"id": 2, "name": "Barry"})]
  14. apply_ query = ConstructQuery( { "id": User.id, "name": apply_(string.upper, #

    функция [User.name]), # аргументы }, db.session, ) [Object({"id": 1, "name": "GUIDO"}), Object({"id": 2, "name": "BARRY"})]
  15. define query = ( ConstructQuery( { "name": User.name, "photo": apply_(url_for_photo,

    [Photo.id, Photo.name]), }, db.session, ) .join(User.photo) )