57
Pycones 2015 Python Comparing ORM José manuel ortega |@jmortegac

Python Comparing ORM

Embed Size (px)

Citation preview

Page 1: Python Comparing ORM

Pycones 2015

Python Comparing ORM

José manuel ortega |@jmortegac

Page 2: Python Comparing ORM

Pycones 2015

https://speakerdeck.com/jmortega

https://medium.com/@jmortegac

Page 3: Python Comparing ORM

Pycones 2015

• Introducción a ORM

• ORM en Python • SqlAlchemy/SQLObject/PonyORM/Peewee/Django-ORM

• Comparativa

• Seguridad

Agenda

Page 4: Python Comparing ORM

Pycones 2015

Introducción a ORM

• Object Relational Mapping

• Mapear objetos en tablas • Crea una BD orientada a objetos virtual

• Es necesario saber cómo funcionan las base de datos a nivel relacional

Page 5: Python Comparing ORM

Pycones 2015

Introducción a ORM

• Mapeo:

• ClaseTabla

• AtributoColumna

• ObjetoFila

Page 6: Python Comparing ORM

Pycones 2015

Ventajas

• Evitar escribir código SQL

• Independizar la fuente de datos

• Mismo código puedo cambiar base de datos

• Fácil modelado de datos

Page 7: Python Comparing ORM

Pycones 2015

Patrones ORM

• Unit of Work

Page 8: Python Comparing ORM

Pycones 2015

Patrones ORM

• Identity Map

• Caché de objetos

Objetos en

BD

Objetos en memoria

Page 9: Python Comparing ORM

Pycones 2015

Introducción a ORM

• Patrones:

• Active Record Pattern

• Relacion 1:1

Object Table /row

Page 10: Python Comparing ORM

Pycones 2015

Introducción a ORM

• Patrones:

• Data Mapper Pattern

Object DataMaper Database

Page 11: Python Comparing ORM

Pycones 2015

ORM en python

SELECT * FROM USERS WHERE zip_code=94107;

users = Users.objects.filter(zip_code=94107)

Page 12: Python Comparing ORM

Pycones 2015

Soporte Bases datos

Page 13: Python Comparing ORM

Pycones 2015

Soporte web FrameWorks

Page 14: Python Comparing ORM

Pycones 2015

Modelo de datos

Page 15: Python Comparing ORM

Pycones 2015

SQLiteBrowser

Page 16: Python Comparing ORM

Pycones 2015

SQLiteBrowser

Page 17: Python Comparing ORM

Pycones 2015

Muchos a muchos

Page 18: Python Comparing ORM

Pycones 2015

SQLalchemy

• Es de los más avanzados • Más flexible para el programador

• Patrón unit of Work

Page 19: Python Comparing ORM

Pycones 2015

SQLalchemy

• Objeto session para persistir los objetos

• session.commit()

Page 20: Python Comparing ORM

Pycones 2015

SQLalchemy Many to many

Page 21: Python Comparing ORM

Pycones 2015

SQLalchemy

Query objects

Page 22: Python Comparing ORM

Pycones 2015

SQLObject

http://sqlobject.org

• No es necesario commit

• Soporta joins

• Relaciones uno-muchos, muchos-muchos

Page 23: Python Comparing ORM

Pycones 2015

SQLObject

event = Event(type="workshop",

description="Usando contenedores para Big Data",

date=date1,

track = track4);

event.addSpeaker(speaker1);

class Event(SQLObject): type = StringCol(length=255) #workshop /talk description = StringCol(length=255) date = DateCol(default=None) track = ForeignKey('Track') speakers = RelatedJoin('Speaker', intermediateTable="speaker_event", joinColumn="eventID", otherColumn="speakerID")

Page 24: Python Comparing ORM

Pycones 2015

SQLObject

<Nombre_clase>.connection.debug=True

Page 25: Python Comparing ORM

Pycones 2015

SQLObject Many to Many

Page 26: Python Comparing ORM

Pycones 2015

Expresiones SQL

SQLObject

event = Event.select(Event.q.description==description)

Page 27: Python Comparing ORM

Pycones 2015

SQLBuilder

from sqlobject.sqlbuilder import *

Page 28: Python Comparing ORM

Pycones 2015

Generación dinámica

A partir de un xml o esquema

Page 29: Python Comparing ORM

Pycones 2015

PonyORM

• Funciona de forma similar a SQLalchemy,mejorando algunas cosas

• Puede trabajar a la vez con varias BD

• Relaciones bidireccionales

https://ponyorm.com

Page 30: Python Comparing ORM

Pycones 2015

PonyORM

db_session

• Realiza un commit si detecta cualquier cambio y no se ha producido ninguna excepción

• Realiza un rollback de la transacción si se produce una excepción

• Gestiona el pool de conexiones con la BD

• Gestiona caché de sesión de forma automática

Page 31: Python Comparing ORM

Pycones 2015

PonyORM

db_session decorator

Page 32: Python Comparing ORM

Pycones 2015

PonyORM

Lambda function

Page 33: Python Comparing ORM

Pycones 2015

PonyORM

Many to Many

Page 34: Python Comparing ORM

Pycones 2015

PonyORM ventajas • Optimización automática de consultas(Automatic

query optimization)

• Gestión automática de transacciones

• Almacenamiento en caché automático de consultas y objetos

• Soporte completo de claves primarias compuestas

• La capacidad de escribir con facilidad consultas utilizando LEFT JOIN, VISTA y otras características de SQL

Page 35: Python Comparing ORM

Pycones 2015

Django ORM

Page 36: Python Comparing ORM

Pycones 2015

Peewee

https://github.com/coleifer/peewee

• Definición de modelos similar a Django

• Patrón ActiveRecord

Page 37: Python Comparing ORM

Pycones 2015

Soporte python 3

SQLObject

Page 38: Python Comparing ORM

Pycones 2015

Primary key

• All create it automatically except SQLAlchemy

id = Column(Integer, primary_key=True)

Page 39: Python Comparing ORM

Pycones 2015

Autocommit=true

db_session

SQLObject

Page 40: Python Comparing ORM

Pycones 2015

Transacciones

try:

with db.atomic() as nested_txn:

object = Entity.create()

return 'Success'

except peewee.IntegrityError:

# This will roll back the above create() query.

nested_txn.rollback()

return 'Failure'

Page 41: Python Comparing ORM

Pycones 2015

Transacciones

@db.atomic() def create_entity():

# This statement will run in a transaction. If the caller is already

# running in an `atomic` block, then a savepoint will be used instead.

return Entity.create()

Page 42: Python Comparing ORM

Pycones 2015

Performance

# Faster

with db.atomic():

for data_dict in data_source:

Model.create(**data_dict)

# Fastest

with db.atomic():

Model.insert_many(data_source).execute()

Page 43: Python Comparing ORM

Pycones 2015

Cache

• Minimizar número de llamadas a BD

• Optimizar consultas

• Identity Map

object = Entity[primary_key]

obj = Entity.objects.get(pk=the_id)]

Page 44: Python Comparing ORM

Pycones 2015

Get Data from Caché

object = Entity.get(Entity.pk == 'value')

object = session.query(Entity).get(pk='value')

Page 45: Python Comparing ORM

Pycones 2015

Generating tables

• PeeWee

db.create_tables([Entity1,Entity2,...,Entityn],True)

try:

<Entity>.create_table()

except peewee.OperationalError:

print “Table already exists!”

Page 46: Python Comparing ORM

Pycones 2015

Generating tables

SQLObject

Base.metadata.create_all(engine)

for each Entity:

Entity.createTable(ifNotExists=True)

Page 47: Python Comparing ORM

Pycones 2015

Generating tables

db = Database("sqlite", "ponyORM_pycon.sqlite", create_db=True)

class Entity(db.Entity):

db.generate_mapping(create_tables=True)

Page 48: Python Comparing ORM

Pycones 2015

Herencia

• Todas soportan herencia para crear las entidades

Page 49: Python Comparing ORM

Pycones 2015

Herencia

Page 50: Python Comparing ORM

Pycones 2015

Herencia

Page 51: Python Comparing ORM

Pycones 2015

Comparativa SQLAlchemy SQLObject PonyORM Peewee Django ORM

Soporte sesión en Base de datos

Automatic Schema Migrations

Many-to-many relations intuitive

Automatic query optimization

Unit of Work

Page 52: Python Comparing ORM

Pycones 2015

Soporte BD ORM BD

SQLAlchemy

MySQL, Postgres, SQLite, Oracle, MSSQLServer,Sybase,FireBird

SQLObject

MySQL, Postgres, SQLite, Sybase, Maxdb, MSSQLServer

PonyORM

MySQL, Postgres, SQLite, Oracle

Peewee

MySQL, Postgres, SQLite

Django ORM

MySQL, Postgres, SQLite,Oracle

Page 53: Python Comparing ORM

Pycones 2015

Seguridad

query = MyModel.select().where(SQL('Some SQL expression %s' % user_data))

query = MyModel.select().where(SQL('Some SQL expression %s' , user_data))

Page 54: Python Comparing ORM

Pycones 2015

Django security

• Binding parameters

Page 56: Python Comparing ORM

Pycones 2015

Testing examples

http://code.runnable.com/Vk8C1Vkf2dAQGrrc/python-comparing-orm-for-sqlobject-sqlalchemy-ponyorm-and-peewee

http://bit.ly/1O9gDn5

Page 57: Python Comparing ORM

Pycones 2015

Thank you!

?