2008-09-10 26 views
181

Estoy evaluando y analizando el uso de CherryPy para un proyecto que básicamente es un front-end de JavaScript desde el lado del cliente (navegador) que habla con un servicio web de Python en el back-end. Por lo tanto, realmente necesito algo rápido y liviano en el back-end que pueda implementar usando Python que luego se dirige al DB de PostgreSQL a través de un ORM (JSON para el navegador).¿Cuáles son algunas buenas soluciones de ORM de Python?

También estoy mirando a Django, que me gusta, ya que su ORM está incorporado. Sin embargo, creo que Django podría ser un poco más de lo que realmente necesito (es decir, más funciones de las que realmente necesito == ¿más lento?).

¿Alguien tiene alguna experiencia con diferentes soluciones ORM de Python que pueden comparar y contrastar sus características y funcionalidad, velocidad, eficiencia, etc.?

+0

[ponyORM] (http://python-orm.com/) se ve muy bien. –

Respuesta

79

SQLAlchemy es más completo y potente (utiliza el patrón DataMapper). Django ORM tiene una sintaxis más limpia y es más fácil de escribir para (patrón ActiveRecord). No sé sobre las diferencias de rendimiento.

SQLAlchemy también tiene un declarative layer que oculta cierta complejidad y le da una sintaxis de estilo ActiveRecord más similar al ORM de Django.

No me preocuparía que Django sea "demasiado pesado". Está desacoplado lo suficiente como para poder usar el ORM si lo desea sin tener que importar el resto.

Dicho esto, si ya estuviera usando CherryPy para la capa web y solo necesitara un ORM, probablemente optaría por SQLAlchemy.

+7

Pero si no te gusta el ORM de Django y quieres usar SA, por ejemplo, pierdes muchas características de django, como admin. No es un factor decisivo, sino una rodilla despellejada. –

+18

Es cierto, pero irrelevante para la pregunta, que fue simplemente sobre elegir un ORM de Python; no se trata de interfaces de administración generadas automáticamente u otros componentes del marco. –

+7

Argumentaría que SQLAlchemy es todo menos ligero, aunque puede ser bastante rápido. Lanzaré mi proyecto a la mezcla, se llama peewee y habla con postgres. ¡Recientemente también agregué soporte para consultas estilo django! http: // charlesleifer.com/docs/peewee/ – coleifer

1

creo que lo podría hacer en:

Autumn

Storm

+0

El otoño es probablemente más fácil que Storm, pero Storm incluye muchas características que Autumn no posee. Ambas opciones tienen documentación limitada, ¡aunque Storm lo está arreglando tan rápido! – alecwh

+0

Gracias, Autumn se ve muy bonito y atractivo, pero tiene cero documentación, lo cual es un factor decisivo para mí. – temoto

+1

Acabo de probar algunos de los ejemplos en la página de otoño, y ni siquiera funcionan con la versión del código que instaló mi gestor de paquetes. Las publicaciones en el grupo de google también son antiguas. Parece que el proyecto está muriendo lentamente. No recomendaría usarlo. –

-5

Me echa un vistazo a SQLAlchemy

Es muy fácil de usar y los modelos con los que trabaja no son malos en absoluto. Django usa SQLAlchemy porque es ORM pero usarlo solo le permite usar su potencia máxima.

He aquí un pequeño ejemplo de cómo crear y seleccionar objetos 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 _no_ utiliza sqlalchemy para su ORM. Se ha realizado un trabajo para hacer que sqlalchemy sea un ORM opcional, pero no está completo. – sherbang

27

Suelo usar SQLAlchemy. Es bastante poderoso y es probablemente el ORM python más maduro.

Si está planeando usar CherryPy, también puede consultar dejavu como es de Robert Brewer (el hombre que es el líder actual del proyecto CherryPy). Personalmente no lo he usado, pero conozco a algunas personas que lo aman.

SQLObject es un poco más fácil de usar que el SQLAlchemy ORM, pero no es tan poderoso.

Personalmente, no usaría el ORM de Django a menos que estuviera planeando escribir todo el proyecto en Django, pero así soy yo.

+0

SQLObject es genial - fácil de usar, base de datos- Independiente y realmente puede hacer las tablas por usted! (Soy perezoso). –

+1

@Lucas - Entonces, ¿puede SQLAlchemy ... –

+0

Por lo que puedo recordar, en general estaba felicitando a SQLObject. Fue hace mucho tiempo, sin embargo ... :) –

9

Utilizamos Elixir junto a SQLAlchemy y nos ha gustado hasta ahora. Elixir pone una capa encima de SQLAlchemy que hace que se parezca más a las partes del contador "Patrón de ActiveRecord".

+2

SQLAlchemy admite OOP y estilos funcionales listos para usar, Elixir agrega un estilo de programación declarativo (principalmente para las declaraciones de modelos, pero puede ser eximido) encima. – muhuk

1

No hay forma concebible de que las características no utilizadas en Django den una penalización de rendimiento.Podría ser útil si alguna vez decides mejorar el proyecto.

+6

hay un * concievable * forma – bukzor

76

Storm tiene posiblemente la API simple:

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

Y es un sencillo programa para caer hacia abajo en SQL crudo cuando es necesario:

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

Gracias por mostrar un ejemplo completo. Tormenta realmente es fácil. – alecwh

+0

Cabe señalar que Storm solo es compatible con MySQL y PostgreSQL en el momento actual. Sin embargo, el soporte de Oracle está en proceso. –

+15

También es compatible con SQLite como el ejemplo anterior sugiere – shearichard

17

declarative extensión de SQLAlchemy, que se está convirtiendo en habitual en 0.5, proporciona una interfaz todo en uno muy similar a la de Django o Storm. También se integra a la perfección con las clases/tablas configuradas usando el estilo 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

Pero las cosas se vuelven muy complejas si hay muchas relaciones, como one_to_many, many_to_many, table inheritance. Tienes que escribir mucho código a mano para poder manejarlos. Verifique mi respuesta para un ORM rápido. Puede ahorrarle tiempo. –

+15

:) en Tyler diciéndole al creador de SQLAlchemy que debería usar el ORM rápido. –

+5

:) Me recuerda a alguien hace años en usenet argumentando con dmr @ alice que realmente no entendía C. –

0

SQLAlchemy es muy, muy poderoso. Sin embargo, no es seguro para subprocesos, asegúrese de tenerlo en cuenta cuando trabaje con cherrypy en el modo de grupo de subprocesos.

+1

¿Es cierto que SQLAlchemy no es inseguro? Entonces, ¿cómo se usa en las aplicaciones de Pyramid sobre WSGI, que principalmente las personas despliegan en modo enhebrado? Cualquier confirmación a esta declaración contradictoria. –

+0

Por supuesto, SQLAlchemy es seguro para subprocesos. –

-1

Utilicé Storm + SQLite para un proyecto pequeño y estuve muy contento con él hasta que agregué el multiprocesamiento. Intentar usar la base de datos de múltiples procesos resultó en una excepción "La base de datos está bloqueada". Cambié a SQLAlchemy, y el mismo código funcionó sin problemas.

+7

Para ser justos, SQLite no está realmente diseñado para accesos concurrentes. –

+2

@Xion +1. SQLITE es un único archivo, sin daemon en ejecución. –

4

Este parece ser el punto de referencia canónica para la interacción de bases de datos de alto nivel en Python: http://wiki.python.org/moin/HigherLevelDatabaseProgramming

A partir de ahí, parece que implementa el patrón Dejavu DataMapper de Martin Fowler bastante abstracto en Python.

+0

Estaba interesado y miré a Dejavu. Solo un poco. La documentación es muy escasa (qoute "para la capa de presentación está solo"), por lo que solo para usuarios avanzados diría. –

89

Si lo que buscas es ligero y ya están familiarizados con los modelos declarativos de estilo Django, echa un vistazo a peewee: https://github.com/coleifer/peewee

Ejemplo:

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') 

Compruebe el docs para más ejemplos.

+12

Esto es muy útil, ¡sigan con el buen trabajo! – rapadura

Cuestiones relacionadas