Каковы некоторые хорошие решения для Python ORM?[закрыто]

StackOverflow https://stackoverflow.com/questions/53428

  •  09-06-2019
  •  | 
  •  

Вопрос

Я оцениваю и рассматриваю возможность использования 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')>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top