Pull to refresh

Comments 16

Когда я последний раз смотрел Peewee, там не было встроенной поддержки One-to-Many, Many-to-Many. Т.е. в pony, например, можно сделать так:
categories = Set('Category', table='item_category', column='category_id')

И у вас есть готовое поле для связанной коллекции категорий. В peewee есть такое?

В yoyo можно выполнить миграцию вне транзакции, столкнулся с такой необходимостью, но не могу найти в документации ничего на этот счет?
А мне кажется, что синтаксис PonyORM как раз очень удобный. Как можно не любить генераторы и лямбы?
P.S. Подскажите, кто знает — PonyORM продолжает развиваться? Потому что уже больше года как назад видел шикарную презентацию его создателей, где они грозились выпустить версию 0.8 с поддержкой миграций, но пока нет её.

Миграции есть в отдельной ветке на гитхабе, можно тестить уже сейчас. Хотя отсутствие релиза действительно печалит

ORM — это инструмент. А каждому инструменту нужно своё применение.
Ребята! Подскажите, пожалуйста, проверенную в бою асинхронную ORM питоновскую для postgres. Хочу что-то такое попробовать, но не знаю на чем остановится: GINO, asyncpg, aiopg
Я пробовал asyncpg и peewee-async.

В одном из недавних проектов у меня есть 2 компонента, которые пересекаются на базе. Один — асинхронный, а второй на Django.

Миграциями я управляю через Django (и считаю его миграции лучшими среди всех), модели всей базы, соответственно, тоже первыми делаются в джанге.

Второй же компонент я сделал на peewee-async, поскольку декларации моделей из джанги переносятся с минимальными изменениями на peewee.

На «чистом» asyncpg я делал проект, в котором в базу писалось очень большим потоком и на SQL, поскольку так было просто удобнее в том проекте. Как таковых моделей там нет, поэтому это не совсем ORM.
ну это мне кажется каким-то костылем, если честно. связывать django с чем-то другим — это уже какой-то фетиш, имхо. а что-то про tortoise orm слышали? tortoise-orm.readthedocs.io/en/latest
Не слышал, спасибо за ссылку. Но версия 0.13.0 как-то не выглядит production-ready.

Насчет костыля — ну тут можно поспорить… Джанго для веба и для миграций пока сложно чем-то заменить.
А для другого компонента я выбрал asyncio-стек и там прикручивать к монолиту с джангой было бы еще большим костылем.
А, ну да, но на такие сырые библиотеки я обычно не смотрю пока они не вырастут немного. Неужели кто-то ее вот уже прямо серьезно использует?
Минусом [Pony] можно назвать синтаксис запросов в этой ORM — он весьма специфический, с применением генераторов, лямбд и прочих языковых плюшек Питона.

По-моему это наоборот большой плюс, которым я активно пользуюсь, так как позволяет писать по сути обычный питоновый код, который в большинстве случаев просто работает. Правда, pylint выпадает в осадок от таких лямбд

Для мелких скриптов, там где городить ORM не хочется, сделал такой маппер sqlmapper, по сравнению c sqlalchemy (+reflect), код выходит компактней и быстрее, примеры:
db = Connection(db='example')  # mysql/psql/sqlite

db.tblname.insert({'name': 'Ubuntu', 'value': 14})
# INSERT INTO `tblname` (`name`, `value`) VALUES ('Ubuntu', 14)

for d in db.tblname.find({'name': 'Ubuntu'}):
    # SELECT tblname.* FROM `tblname` WHERE `tblname`.`name`='Ubuntu'
    print(d)

И добавление таблиц/колонок если ещё не созданы:
# a table is created for first column
db.tblname.add_column('id', 'INT(11)', primary=True, auto_increment=True, exist_ok=True)
# CREATE TABLE `tblname` (`id` INT(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY ...

db.tblname.add_column('name', 'VARCHAR(32)', exist_ok=True)
# ALTER TABLE `tblname` ADD COLUMN `name` VARCHAR(32)

Sign up to leave a comment.

Articles