Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
.where((Person.birthday > d1940) & (Person.birthday < d1960))
Currently peewee does not have support for automatic schema migrations
Хорошая альтернатива Алхимии, как считаете?
.filter((Person.birthday > d1940) & (Person.birthday < d1960)). Во всем всем остальном DSL почти 1 в 1 как алхимии, судя по докам. Интересно, я уже давно слежу за PonyOrm, но мне почему-то наоборот казалось что оно настолько похоже на алхимию что мигрировать с одного на другое смысла нет.
u = session.query(AUser).filter(AUser.id==i+1)[0]
u = select(u for u in PUser if u.id==i+1)[:1][0]
u = select(u for u in PUser if u.id==i+1).get()
public interface UserRepository extends Repository<User, Long> {
List<User> findByEmailAddressAndLastname(String emailAddress, String lastname);
}
public interface UserRepository extends JpaRepository<User, Long> {
@Query("select u from User u where u.emailAddress = ?1")
User findByEmailAddress(String emailAddress);
}
Но в SQLAlchemy цепочки методов сделаны не просто так, а для того что бы можно было программно конструировать разные запросы в разных частях приложения, в отличии от Pony где вы один раз написали генератор и все.
Ну и то что все делается напрямую через сессию, которая не скрыта за какими-то декораторами для функций, тоже плюс, так как это питон и явное лучше неявного.
Эм. Поясните мне про что речь. Обычно если вы уж написали последовательный вызов функций в тексте, то так он и будет. Как вы его там менять собираетесь мне право интересно.
В ponyorm скрыта сессия? Где?
Так я именно про это и говорю — алхимия позволяет не писать последовательный вызов функций в одном месте. В одном месте мы можем сделать JOIN, во втором — второй JOIN, в третьем мы можем опять таки программно сконструировать фильтр, а в четвертом применить сортировку. Это же обычные методы, как мы захотим так их и скомбинируем.
Это позволяет разбивать и выделать общие запросы и на этом и основывается вся работа в алхимии — вы создаете классы которые уже имеют все нужные вам реляции (с джоинами или без) которые затем просто фильтруются или на их основе делаются более сложные запросы.
Вот и я не знаю где, все что я вижу это глобальные функции типа commit и rollback которые на самом деле где-то управляют сессией но саму сессию я не вижу, и это меня смущает.
Another option for working with the database is using db_session as a context manager instead of a decorator:
with db_session: p = Person(name='Kate', age=33) Car(make='Audi', model='R8', person=p) # commit() will be done automatically # transaction cache will be cleared automatically # the database connection will be returned to the pool
Эм. У меня дурацкий вопрос. Что мешает это делать в случае ponyorm? Вызов там ровно точно такой же. Вызвали select написали что надо оно сгенерило.
class User(db.Model):
id = db.Column(db.Integer)
verified_transactions = db.relationship(
Transaction, primaryjoin=lambda: (Transaction.user_id == User.id) &
(Transaction.verified == True)
)
unverified_transactions = db.relationship(
Transaction, primaryjoin=lambda: (Transaction.user_id == User.id) &
(Transaction.verified == False)
)
class Transaction(db.Model):
id = db.Column(db.Integer)
type = db.Column(db.String(32))
amount = db.BigInteger()
user = db.Column(db.Integer, db.ForeignKey(User.id))
def filter_txs_by_type(query, type)
return query.filter(Transaction.type == type)
def filter_txs_by_amount_gt(query, amount):
return query.filter(Transaction.amount > amount)
all_verified_txs = User.verified_transactions
verified_received_txs = filter_txs_by_type(all_verified_txs, 'RECEIVE')
verified_received_txs_gt_1000 = filter_txs_by_amount_gt(verified_received_txs, 1000)
Эм… а кто вам сказал что реляций в ponyorm то нет?
Официальная дока:
Это конечно немного наигранный пример, но в целом показывает именно то что я хочу описать — программное конструирование запросов
Они там есть, но не такие мощные как в алхимии
Ну вот вы и привели пример глобальных функций которые сами управляют сессией где-то у себя про что я собственно и говорю
Первое что я могу сразу сказать, что вот такой код я сразу прошу переписать, без обид. Вы понимаете что делаете? Для того чтобы понять что в итоге выбирается надо залезть в два разных места. Теряется прозрачность за счет этого весьма просто что-то сломать да так что еще и причина будет не очевидна. По этой причине лучше запрос так не дробить.
Очень-очень странное заявление, если например у нас есть список транзакций и у транзакции есть тип, статус, размер и дата, и нам нужно сделать фильтр по всем этим параметрам не будете же вы писать кучу запросов для каждого варианта.
То же самое относится и к реляциям, фильтрованным или нет — это отнюдь не редкая, а наоборот — самая и наиболее часто используемая фича в алхимии
Я просто не представляю как можно писать ручками каждый запрос если можно разбить все — вынести реляции, вынести часто используемые фильтры и группировки и зачем просто комбинировать их по мере надобности.
Молодец. Порекламировался? Статья была вообще-то про Peewee, один из самых легковесных ORM.
Немного низковато использовать чужой бренд, чужие имена для саморекламы, вы не находите?
Может, просто, людям и нафиг не нужен этот непривычный синтаксис построения запросов? Может у них другие требования к коду, — не задумывались?
Когда мне Гугл выдает по запросу «Python ORM» первой строкой эту мальчишескую подделку ponyorm, и только потом показывает серьезный и глубоко продуманный труд SQLAlchemy
— Процитируете?
Когда мне Гугл выдает по запросу «Python ORM» первой строкой эту мальчишескую подделку ponyorm
Но в отличии от Peewee, SQLAlchemy очень популярен, и имеет довольно хорошие отзывы весьма авторитетных Питонщиков, вот только один из них (python core developer) asvetlov.blogspot.com/2008/09/sqlalchemy-vs-sqlobject.html
В жизни не поверю, что Pony ORM настолько стал популярным, что оттеснил SQLAlchemy на вторую позицию в выдаче Гугла. Из чего просто напрашивается вывод, что в ход пошли манипуляции SEO.
Pony is a cool and new Python ORM that lets you query a database using Python generators.
SQLAlchemy is the Python SQL toolkit and Object Relational Mapper that gives
SQLAlchemy is most famous for its object-relational mapper (ORM)
— Мы тут обсуждаем Peewee. У Вас есть опыт использования Peewee? Тогда расскажите о нем. А иначе Вы не опытом делитесь, а просто присасываетесь к чужому труду (автора статьи, разработчиков Peewee), для продвижения собственных интересов и элементарной рекламы.
Разрабатывали Вы Pony ORM, проплачены Вы ими, или просто добровольный рекламатор, — это сути дела не меняет.
не знаю, мне это не интересно. Я не разбирался какие именно методы оптимизации имели место. Но я знаю, что хороший товар продает себя сам.
— а что, слово openembedded так часто ищут в поисковиках? Не льстите себе…
class Meta:
indexes = (
(('field1', 'field2'), True),
)
Peewee – лёгкая, гибкая и очень быстрая ORM на Python