Каковы некоторые хорошие решения для Python ORM?[закрыто]
Вопрос
Я оцениваю и рассматриваю возможность использования CherryPy для проекта, который в основном представляет собой интерфейс JavaScript на стороне клиента (браузера), который взаимодействует с веб-сервисом Python на внутренней стороне.Итак, мне действительно нужно что-то быстрое и легкое на серверной части, что я могу реализовать с помощью Python, который затем взаимодействует с базой данных PostgreSQL через ORM (JSON для браузера).
Я также смотрю на Django, который мне нравится, так как в него встроен ORM.Тем не менее, я думаю, что Django может быть немного больше, чем мне действительно нужно (т.Е.больше функций, чем мне действительно нужно == медленнее?).
У кого-нибудь есть опыт работы с различными решениями Python ORM, которые могут сравнивать их возможности, скорость, эффективность и т.д.?
Решение
SQLAlchemy более полнофункциональна и мощна (использует шаблон DataMapper).Django ORM имеет более чистый синтаксис и для него проще писать (шаблон ActiveRecord).Я не знаю о различиях в производительности.
SQLAlchemy также имеет декларативный уровень это скрывает некоторую сложность и придает ему синтаксис в стиле ActiveRecord, более похожий на Django ORM.
Я бы не беспокоился о том, что Django "слишком тяжелый". Он достаточно развязан, чтобы вы могли использовать ORM, если хотите, без необходимости импортировать остальное.
Тем не менее, если бы я уже использовал CherryPy для веб-уровня и мне просто нужен был ORM, я бы, вероятно, выбрал SQLAlchemy.
Другие советы
Если вы ищете легковесные и уже знакомы с декларативными моделями в стиле 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')
Проверьте Документы для получения дополнительных примеров.
Шторм имеет, пожалуй, самый простой 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()
Обычно я использую SQL - алхимия.Это довольно мощный и, вероятно, самый зрелый python ORM.
Если вы планируете использовать CherryPy, вы также можете заглянуть в дежавю автор - Роберт Брюер (парень, который является нынешним руководителем проекта CherryPy).Лично я им не пользовался, но я знаю некоторых людей, которым это нравится.
Квадратный объект использовать ORM немного проще, чем SQLAlchemy, но он не такой мощный.
Лично я бы не стал использовать Django ORM, если бы не планировал писать весь проект на Django, но это касается только меня.
sqlalchemy's декларативный расширение, которое становится стандартным в версии 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()
Мы используем Эликсир наряду с SQLAlchemy, и мне это до сих пор нравилось.Elixir помещает слой поверх SQLAlchemy, который делает его больше похожим на части счетчика "ActiveRecord pattern".
Похоже, это каноническая точка отсчета для взаимодействия с базой данных высокого уровня в Python:http://wiki .python.org/moin/HigherLevelDatabaseProgramming
Оттуда это выглядит так Дежавю реализует шаблон DataMapper Мартина Фаулера довольно абстрактно на Python.
Не существует никакого мыслимого способа, которым неиспользуемые функции в Django приводили бы к снижению производительности.Может просто пригодиться, если вы когда-нибудь решите расширить масштаб проекта.
SQLAlchemy очень, очень мощная программа.Однако это не является потокобезопасным, убедитесь, что вы помните об этом при работе с cherrypy в режиме пула потоков.
Я использовал Storm + SQLite для небольшого проекта и был вполне доволен им, пока не добавил многопроцессорность.Попытка использовать базу данных из нескольких процессов привела к исключению "База данных заблокирована".Я переключился на SQLAlchemy, и тот же код работал без проблем.
Я бы проверил SQL - алхимия
Он действительно прост в использовании, и модели, с которыми вы работаете, совсем неплохие. 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')>