Какие есть хорошие решения Python ORM?

Я оцениваю и смотрю на использование CherryPy для проекта, который в основном представляет собой интерфейс JavaScript со стороны клиента (браузера), который взаимодействует с веб-службой Python на стороне клиента. Итак, мне действительно нужно что-то быстрое и легкое на бэкэнде, которое я могу реализовать с помощью Python, который затем обращается к базе данных PostgreSQL через ORM (JSON для браузера).

Я также смотрю на Django, который мне нравится, поскольку его ORM встроен. Однако я думаю, что Django может быть немного больше, чем мне действительно нужно (т.е. больше функций, чем мне действительно нужно == медленнее?).

У кого-нибудь есть опыт работы с различными решениями Python ORM, которые могут сравнивать и сравнивать их функции и функциональность, скорость, эффективность и т. д.?

ponyORM looks pretty nice.
Niklas R 19.08.2014 16:41

Объектно-реляционное сопоставление (ORM) уже очень популярно во многих языках программирования и является одной из лучших альтернатив SQL. На создание CQL для моего проекта TRIADB меня вдохновил стиль цепочки методов. healis.eu/triadb/#latest-release

Athanassios 10.07.2019 10:31
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
216
2
149 049
12
Перейти к ответу Данный вопрос помечен как решенный

Ответы 12

Думаю, вы могли бы посмотреть:

Осень

Буря

Осень, вероятно, проще, чем Storm, но Storm включает в себя много функций, которых нет в Autumn. Документация по обоим этим параметрам ограничена, хотя Storm так быстро исправляет!

alecwh 10.07.2009 01:33

Спасибо, Autumn выглядит очень красиво и привлекательно, но без документации, что для меня является преградой.

temoto 20.04.2010 17:36

Я просто попробовал некоторые из примеров на осенней странице, и они даже не работают с версией кода, установленным моим диспетчером пакетов. Посты в гугл группе тоже старые. Похоже, проект умирает медленной смертью. Не рекомендую его использовать.

Jason Miesionczek 08.06.2010 16:24

С другой стороны, Storm быстро становится моим предпочтительным ORM. Документы становятся лучше, а API ясен и прост, хотя я немного больше привык к шаблону ActiveRecord, используемому в Django ORM, я считаю, что в Storm легко ориентироваться.

Jason Miesionczek 08.06.2010 16:25

Похоже, что у Autum не было никакой активности в течение года. groups.google.com/group/autumn-orm

Sridhar Ratnakumar 31.08.2010 03:47

Я бы посмотрел SQLAlchemy

Его действительно легко использовать, и модели, с которыми вы работаете, совсем не плохие. Django использует SQLAlchemy для ORM, но его использование само по себе позволяет использовать его на полную мощность.

Вот небольшой пример создания и выбора объектов orm

>>> ed_user = User('ed', 'Ed Jones', 'edspassword')
>>> session.add(ed_user)
>>> our_user = session.query(User).filter_by(name='ed').first() 
>>> our_user
    <User('ed','Ed Jones', 'edspassword')>

Django использует нет sqlalchemy для ORM. Была проделана некоторая работа, чтобы сделать sqlalchemy необязательной ORM, но она не завершена.

sherbang 11.09.2008 06:39
Ответ принят как подходящий

SQLAlchemy более полнофункциональный и мощный (использует шаблон DataMapper). Django ORM имеет более чистый синтаксис и его легче писать (шаблон ActiveRecord). Насчет разницы в производительности не знаю.

SQLAlchemy также имеет декларативный слой, который скрывает некоторую сложность и придает ему синтаксис в стиле ActiveRecord, более похожий на Django ORM.

Я бы не стал беспокоиться о том, что Django «слишком тяжелый». Он достаточно развязан, чтобы вы могли использовать ORM, если хотите без необходимости импортировать остальное.

Тем не менее, если бы я уже использовал CherryPy для веб-слоя и просто нуждался в ORM, я бы, вероятно, выбрал SQLAlchemy.

Но если вам не нравится ORM Django и вы хотите использовать SA, например, вы теряете множество функций django, таких как admin. Не нарушитель сделки, а ободранное колено.

Gregg Lind 21.02.2009 00:22

Верно, но не имеет отношения к вопросу, который просто касался выбора ORM для Python; не о автоматически сгенерированных интерфейсах администратора или других компонентах фреймворка.

Carl Meyer 23.02.2009 04:55

Я бы сказал, что SQLAlchemy совсем не легковесен - хотя он может быть довольно быстрым. Я добавлю свой проект в микс, он называется peewee и общается с postgres. Совсем недавно добавлена ​​поддержка запросов в стиле django! charlesleifer.com/docs/peewee

coleifer 16.09.2011 06:55

Вас также может заинтересовать pypi.python.org/pypi/quick_orm

Tyler Long 11.11.2011 22:23

Не используйте SQLAlchemy, если вы хотите писать в шаблоне ActiveRecord. Почему? Просто прочтите документ docs.sqlalchemy.org/en/rel_0_7/orm/query.html и расскажите мне, как установить order_by в порядке DESC. Да, декларативный слой SQLAlchemy имеет ужасную документацию.

yegle 22.11.2012 08:18

Также обратите внимание, что Django ORM не поддерживает составные первичные ключи, а SQLAlchemy поддерживает его.

Marcin Kapusta 12.09.2013 14:55

@yegle Меня смущает ваш комментарий. Я не понимаю логики. Как "трудно найти инструкции по ORDER BYDESC в документации" означает "плохой для шаблона активной записи"?

jpmc26 10.01.2014 04:27

@ jpmc26 Поскольку SQLAlchemy имеет другой шаблон, не относящийся к ActiveRecord (недекларативный уровень), здесь docs.sqlalchemy.org/en/rel_0_7/core/schema.html, который более устойчив по сравнению с моим PoV и лучше, чем его декларативный шаблон. Но этот комментарий был опубликован более 1 года назад для SQLAlchemy версии 0.7, после этого я не часто использовал SQLAlchemy, так что используйте свое собственное суждение :-)

yegle 11.01.2014 15:31

Я обычно использую SQLAlchemy. Это довольно мощный и, вероятно, самый зрелый ORM для Python.

Если вы планируете использовать CherryPy, вы также можете изучить дежавю, поскольку он написан Робертом Брюером (парнем, который в настоящее время является руководителем проекта CherryPy). Я лично не использовал его, но знаю некоторых людей, которым он нравится.

SQLObject немного проще в использовании ORM, чем SQLAlchemy, но он не такой мощный.

Лично я бы не стал использовать Django ORM, если не планировал писать весь проект на Django, но это только я.

SQLObject великолепен - простой в использовании, независимый от базы данных, и он действительно может создавать таблицы за вас! (Мне лень).

Lucas Jones 01.07.2010 14:43

@Lucas - Как и SQLAlchemy ...

Jason Baker 27.11.2010 00:53

Насколько я помню, я просто хвалил SQLObject. Хотя это было давно ... :)

Lucas Jones 27.11.2010 01:28

@Lucas - Я так и думал. Просто подумал, что запомню это. :-)

Jason Baker 27.11.2010 02:23

Мы используем Эликсир вместе с SQLAlchemy, и пока он нам нравится. Elixir помещает слой поверх SQLAlchemy, что делает его более похожим на части «паттерна ActiveRecord».

SQLAlchemy поддерживает ООП и функциональные стили из коробки, Elixir добавляет поверх него декларативный стиль программирования (в основном для объявлений моделей, но с возможностью расширения).

muhuk 19.12.2008 13:36

Невозможно представить, чтобы неиспользуемые функции в Django снижали производительность. Может пригодиться, если вы когда-нибудь решите масштабировать проект.

есть способ понятный

bukzor 23.09.2010 04:27

Буря имеет, пожалуй, самый простой API:

from storm.locals import *

class Foo:
    __storm_table__ = 'foos'
    id = Int(primary=True)


class Thing:
    __storm_table__ = 'things'
    id = Int(primary=True)
    name = Unicode()
    description = Unicode()
    foo_id = Int()
    foo = Reference(foo_id, Foo.id)

db = create_database('sqlite:')
store = Store(db)

foo = Foo()
store.add(foo)
thing = Thing()
thing.foo = foo
store.add(thing)
store.commit()

И это позволяет безболезненно перейти к необработанному SQL, когда вам нужно:

store.execute('UPDATE bars SET bar_name=? WHERE bar_id like ?', []) 
store.commit()

Следует отметить, что на данный момент Storm поддерживает только MySQL и PostgreSQL. Тем не менее, поддержка Oracle находится в разработке.

Jason Baker 06.08.2009 20:25

Он также поддерживает SQLite, как следует из приведенного выше примера.

shearichard 08.05.2010 13:31

quick_orm так же прост, как Storm, и основан на SQLAlchemy, поэтому он также очень мощный: pypi.python.org/pypi/quick_orm. Отказ от ответственности: я являюсь автором quick_orm

Tyler Long 11.11.2011 21:46

Спасибо за пример. У меня был вопрос о Шторме и отношениях «многие к одному». Я следую инструкциям и помещаю ссылку в конец моего файла за пределами класса, а затем импортирую другой класс, а в другом классе я импортирую текущий класс, и это создает импорт Ciruclar, но я не знаю, как еще это сделать?

Matilda 24.10.2012 03:59

Буря не поддерживается. Я бы не стал использовать его для новых проектов.

Matthias Urlichs 21.06.2014 21:14

Кроме того, похоже, что для Python 3 нет Storm

ygormutti 23.07.2014 22:17

Расширение SQLAlchemy декларативный, которое становится стандартом в версии 0.5, предоставляет универсальный интерфейс, очень похожий на Django или Storm. Он также легко интегрируется с классами / таблицами, настроенными с использованием стиля datamapper:

Base = declarative_base()

class Foo(Base):
    __tablename__ = 'foos'
    id = Column(Integer, primary_key=True)

class Thing(Base):
    __tablename__ = 'things'

    id = Column(Integer, primary_key=True)
    name = Column(Unicode)
    description = Column(Unicode)
    foo_id = Column(Integer, ForeignKey('foos.id'))
    foo = relation(Foo)

engine = create_engine('sqlite://')

Base.metadata.create_all(engine)  # issues DDL to create tables

session = sessionmaker(bind=engine)()

foo = Foo()
session.add(foo)
thing = Thing(name='thing1', description='some thing')
thing.foo = foo  # also adds Thing to session
session.commit()

Но все становится очень сложным, если существует много отношений, таких как one_to_many, many_to_many, наследование таблиц. Вы должны написать много кода вручную, чтобы справиться с ними. Проверьте мой ответ на Quick ORM. Это может сэкономить ваше время.

Tyler Long 11.11.2011 22:20

:) когда Тайлер говорит создателю SQLAlchemy, что ему следует использовать Quick ORM.

Anthony Briggs 29.02.2012 15:24

:) Напоминает мне, как много лет назад кто-то на usenet спорил с dmr @ alice, что он действительно не понимает C.

Peter Rowell 11.04.2012 09:07

@AnthonyBriggs, посмотрите этот слайд, и вы поймете, почему quick_orm лучше справляется со сложными отношениями, чем SQLAlchemy: slideshare.net/tyler4long/quickorm

Tyler Long 30.06.2012 09:16

SQLAlchemy очень и очень мощный. Однако он не является потокобезопасным, убедитесь, что вы помните об этом при работе с cherrypy в режиме пула потоков.

правда ли, что SQLAlchemy не является потокобезопасным? Тогда как он используется в приложениях Pyramid поверх WSGI, которые в основном люди развертывают в многопоточном режиме? Никаких подтверждений этому противоречивому утверждению.

Ravi Kumar 10.08.2013 21:38

Конечно, SQLAlchemy ориентирована на многопоточность.

Matthias Urlichs 21.06.2014 21:17

Я использовал Storm + SQLite для небольшого проекта и был очень доволен им, пока не добавил многопроцессорность. Попытка использовать базу данных из нескольких процессов привела к исключению «База данных заблокирована». Я перешел на SQLAlchemy, и тот же код работал без проблем.

Честно говоря, SQLite не предназначен для одновременного доступа.

Xiong Chiamiov 31.03.2011 21:50

@Xion +1. SQLITE - это единственный файл без запущенного демона.

e-satis 31.10.2011 15:22

Кажется, это каноническая точка отсчета для высокоуровневого взаимодействия с базой данных в Python: http://wiki.python.org/moin/HigherLevelDatabaseProgramming

Отсюда похоже, что Дежавю довольно абстрактно реализует шаблон DataMapper Мартина Фаулера в Python.

Я заинтересовался и посмотрел на дежавю. Лишь малость. Документация очень скудная (цитата «для уровня представления вы сами по себе»), поэтому я бы сказал, только для опытных пользователей.

r4. 19.01.2012 03:19

Если вы ищете легковесные и уже знакомы с декларативными моделями в стиле django, посмотрите peewee: https://github.com/coleifer/peewee

Пример:

import datetime
from peewee import *

class Blog(Model):
    name = CharField()

class Entry(Model):
    blog = ForeignKeyField(Blog)
    title = CharField()
    body = TextField()
    pub_date = DateTimeField(default=datetime.datetime.now)

# query it like django
Entry.filter(blog__name='Some great blog')

# or programmatically for finer-grained control
Entry.select().join(Blog).where(Blog.name == 'Some awesome blog')

Проверьте документы для получения дополнительных примеров.

Другие вопросы по теме