Как стать автором
Обновить

Комментарии 10

Один я не знал, что так можно?

 def __repr__(self):
        return "<{0.__class__.__name__}(id={0.id!r})>".format(self)

Судя по всему да.
Вообще можно даже значение словаря получить по ключу (пишите так же квадратные скобки, но значение ключа без кавычек) или значение массива по индексу.

Я, честно говоря, не очень внимательно документацию читал, но не помню там описания такого трюка. Ну и вообще, это какая-то дверь в ад, типа eval и exec:

class Tst:

    def __init__(self):
        self._a = 1

    @property
    def a(self):
        print('hahaha')
        return self._a


if __name__ == '__main__':

    tst = Tst()
    print('{0.a}'.format(tst))

Как по мне, дверью в ад являются f-strings (Python>=3.6), которые упомянули ниже.
Там напрямую функции легко можно вызвать.
Поэтому форматирование нужно использовать обдуманно и не форматировать строки извне, а только те, которым вы доверяете (т.е. находящимся внутри кода).

Как по мне — f-strings тут к месту
def __repr__(self):
    return f"<{type(self).__name__}(id={self.id})>"
Тяжеловатая статья. Тем кто собирается изучить SQLAlchemy предлагаю начать с Мега-учебника Гринберга и после сразу переключиться на официальную документацию.
По моему мнению декларативное описание несколько чудное и отношения раскрыты недостаточно (да я видел слово «основы» в названии).
Непонятно почему используется VARCHAR, а не String.
Статическая типизация по дефолту и эти сахарные-этажи в формат-синтаксисе это фишечки питона 3.6+

Неплохая статья но мне кажется не выдержан темп, для какого-то «промо-обучения» все скомкано все и сумбурно и текст оформлен некрасиво, а если «для тех кто уже работает с алхимией» — то обозначенные кейсы обычные, в документации все описано (за исключением конечно "<{0.__class__.__name__}(id={0.id!r})>" :), но это питон 3.6)

в уроке 7 насколько я разглядел опечатка с «uselist=False» он внутри скобки с and_(). И вообще, может я конечно чего-то не понял — но урок 7 смотрится как-то вообще оторванным от контекста — во первых из только текста этого урока непонятно к какой родительской модельке относится этот релатион, и определение моделек CadreMovement, EmployeeWithCadreMovements и т.п. выше не описано

Еще круто бы в статье описать действительно сложные случаи в алхимии как например использование CTE и рекурсивных запросов или про правильное понимание .correlate() и когда и как его нужно использовать. Сам последнее время ковыряюсь с различными JSON-функциями postgres типа jsonb_array_elements чтоб их впилить в проект на алхимии, в этой области тоже довольно много интересного при составлении запросов :).

И вообще с итогом не соглашусь всетаки, случаи когда алхимический запрос именно будет «нечитаемым» перед аналогичным написанием в программе питоне в сыром виде — редки. Да он может «по строчкам» оказаться больше, однако читать его будет гораздо легче, потому что первостепенно — гораздо проще его можно разложить на смысловые блоки. Алхимия тем и хороша что довольно гибка и огромное количество фишек которые предоставляет база — можно воплотить с помощью нее.
документации все описано (за исключением конечно "<{0.class.name}(id={0.id!r})>" :), но это питон 3.6)

Я не хочу прикапываться к словам, но это и в 2.7 работает. Не знаю как насчёт '!r', но остальная конструкция точно.

Вот у меня один вопрос — в этом мире кроме TypeOrm и EntityFramework есть хоть одна orm которая может генерить миграции по изменениям в коде моделей?

Миграция схемы — alembic, если мы говорим об SQLAlchemy.
Миграции данных делаешь сам.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории