2008-09-10 3 views
181

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

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

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

+0

[ponyORM] (http://python-orm.com/) выглядит довольно красиво. – 2014-08-19 12:41:53

ответ

79

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

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

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

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

+7

Но если вам не нравится ORM Django, и вы хотите использовать SA, например, вы теряете множество функций django, таких как admin. Не разбойник, а кожаное колено. – 2009-02-20 21:22:20

+18

Правда, но не имеет отношения к вопросу, который был просто о выборе ORM Python; а не о автоматически создаваемых админ-интерфейсах или других компонентах инфраструктуры. – 2009-02-23 01:55:34

+7

Я бы сказал, что SQLAlchemy не имеет ничего общего, но может быть довольно быстрым. Я брошу свой проект в миксе, он называется peewee, и он говорит о postgres. Совсем недавно добавлена ​​поддержка запросов в стиле django! Http: // charlesleifer.com/docs/peewee/ – coleifer 2011-09-16 02:55:30

1

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

Autumn

Storm

+0

Осень, вероятно, проще, чем Storm, но Storm включает в себя множество функций, которых нет у Autumn. Оба этих варианта имеют ограниченную документацию, хотя Storm исправляет это быстро! – alecwh 2009-07-09 21:33:03

+0

Спасибо, осень выглядит очень красиво и привлекательно, но имеет нулевую документацию, которая для меня является нарушителем транзакций. – temoto 2010-04-20 13:36:11

+1

Я просто попробовал некоторые примеры на странице «Осень», и они даже не работают с версией кода, установленным моим диспетчером пакетов. Сообщения в группе google также являются старыми. Похоже, что проект умирает медленной смертью. Не рекомендовал бы его использовать. – 2010-06-08 12:24:36

-5

Я бы проверить SQLAlchemy

Это очень проста в использовании и модели, которые работают с не плохо вообще. Django использует SQLAlchemy для 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')> 
+17

Django делает _not_ использование sqlalchemy для ORM. Проделана определенная работа, чтобы сделать sqlalchemy опциональным ORM, но он не завершен. – sherbang 2008-09-11 02:39:13

27

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

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

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

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

9

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

1

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

76

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() 
17

declarative расширение 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() 
0

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

-1

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

4

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

Оттуда, похоже, Dejavu реализует паттерн DataMapper Мартина Фаулера довольно отвлеченно в Python.

89

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

Смежные вопросы