Какие хорошие решения ORM для Python?

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

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

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

Ответ 1

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

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

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

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

Ответ 2

Если вы ищете легкий вес и уже знакомы с декларантными моделями в стиле джанго, проверьте 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')

Подробнее см. docs.

Ответ 3

Storm, возможно, является самым простым 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()

Ответ 4

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

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

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

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

Ответ 5

SQLAlchemy declarative расширение, которое становится стандартным в 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()

Ответ 6

Мы используем Elixir вместе с SQLAlchemy и вам понравилось. Elixir накладывает слой поверх SQLAlchemy, что делает его более похожим на элементы счетчика "ActiveRecord pattern".

Ответ 7

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

Оттуда он выглядит как Dejavu довольно абстрактно использует шаблон DataMapper Мартина Фаулера в Python.

Ответ 8

Я думаю, вы можете посмотреть:

Autumn

Storm

Ответ 9

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

Ответ 10

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

Ответ 11

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

Ответ 12

Я бы посмотрел 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')>