• Как разнести модели в одтельные файлы в PonyORM?

    @metaprogrammer
    Добрый день!

    Ответ angru является правильным, я просто дам несколько дополнительных уточнений.

    Как правильно сказано, generate_mapping() нужно вызывать один раз после того, как все сущности определены. После этого схема фиксируется и добавлять новые сущности в нее уже нельзя.

    Когда объявляется класс сущности, то он становится доступен как атрибут объекта базы данных. То есть, если сущность опредена как:

    db = Database()
    
    class Person(db.Entity):
        name = Required(str)

    то после этого можно ссылаться на нее так: db.Person. Например, в запросах:

    select(p for p in db.Person if p.name.startswith('A'))

    Поэтому импортировать модели в main.py необязательно - они уже доступны там как атрибуты объекта db.

    Часть наиболее важных сущностей можно при желании определить в том же самом файле, где объявляется объект db.

    Иногда может быть удобнее не объявлять параметры объекта Database сразу при его создании, а выполнять метод db.bind(...) непосредственно перед выполнением метода db.generate_mapping(...) - тогда одни и те же сущности могут использованы с разными типами баз данных (например, SQLite и MySQL).
    Ответ написан
    5 комментариев
  • Как можно осуществить массовое добавление в PonyORM?

    @metaprogrammer
    Добрый день! Я автор Pony ORM.
    Краткий ответ: Такой функцональности пока нет, но мы не прочь в ближайшее время ее добавить. Будет здорово если вы откроете на эту тему issue на гитхабе: https://github.com/ponyorm/pony/issues/

    Подробный ответ:
    Насколько я понимаю, метод `bulk_create` в Django делает не совсем то же самое что метод `add_all` в Алхимии. `bulk_create` добивается двух целей:
    1) Посылает все инсерты в базу в одной транзакции
    2) По возможности посылает все эти инсерты в одном запросе

    В SQLAlchemy `add_all` добавляет все новые объекты в сессию. В дальнейшем в процессе выполнения коммита все эти объекты будут сохранены в рамках текущей транзакции. Но за то, посылать все эти инсерты в одном общем запросе или нет `add_all` не отвечает.

    В PonyORM такой метод как `add_all` просто не нужен, потому что добавление объекта в сессию происходит автоматически во время создания объекта. При этом все инсерты автоматически будут выполнены в рамках одной транзакции, а не как в Django по умолчанию. Значит, всё чего не хватает - это чтобы инсерты шли в одной общей команде `executemany`.

    Но я думаю что для этого не нужно делать какой-то метод. Будет правильнее и проще, если PonyORM сама распознает, что серию идущих подряд инсертов можно выполнить в одном общем запросе. При этом API никак не меняется, а просто добавляется некая внутренняя оптимизация.

    Я готов это добавить, но не на этой неделе, потому что прямо сейчас я плотно занимаюсь поддержкой третьего Питона, и надеюсь что через несколько дней выйдет новый релиз, в котором эта поддержка появится. После этого я готов добавить `bulk_insert`, если кто-нибудь сделает соответствующую напоминалку в виде issue на Гитхабе: https://github.com/ponyorm/pony/issues
    Ответ написан
    1 комментарий