Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

Pycones 2015 https://speakerdeck.com/jmortega https://medium.com/@jmortegac

Slide 3

Slide 3 text

Pycones 2015 • Introducción a ORM • ORM en Python • SqlAlchemy/SQLObject/PonyORM/Peewee/Django-ORM • Comparativa • Seguridad Agenda

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

Pycones 2015 Introducción a ORM • Mapeo: • ClaseTabla • AtributoColumna • ObjetoFila

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

Pycones 2015 Patrones ORM • Unit of Work

Slide 8

Slide 8 text

Pycones 2015 Patrones ORM • Identity Map • Caché de objetos Objetos en BD Objetos en memoria

Slide 9

Slide 9 text

Pycones 2015 Introducción a ORM • Patrones: • Active Record Pattern • Relacion 1:1 Object Table /row

Slide 10

Slide 10 text

Pycones 2015 Introducción a ORM • Patrones: • Data Mapper Pattern Object DataMaper Database

Slide 11

Slide 11 text

Pycones 2015 ORM en python SELECT * FROM USERS WHERE zip_code=94107; users = Users.objects.filter(zip_code=94107)

Slide 12

Slide 12 text

Pycones 2015 Soporte Bases datos

Slide 13

Slide 13 text

Pycones 2015 Soporte web FrameWorks

Slide 14

Slide 14 text

Pycones 2015 Modelo de datos

Slide 15

Slide 15 text

Pycones 2015 SQLiteBrowser

Slide 16

Slide 16 text

Pycones 2015 SQLiteBrowser

Slide 17

Slide 17 text

Pycones 2015 Muchos a muchos

Slide 18

Slide 18 text

Pycones 2015 SQLalchemy • Es de los más avanzados • Más flexible para el programador • Patrón unit of Work

Slide 19

Slide 19 text

Pycones 2015 SQLalchemy • Objeto session para persistir los objetos • session.commit()

Slide 20

Slide 20 text

Pycones 2015 SQLalchemy Many to many

Slide 21

Slide 21 text

Pycones 2015 SQLalchemy Query objects

Slide 22

Slide 22 text

Pycones 2015 SQLObject http://sqlobject.org • No es necesario commit • Soporta joins • Relaciones uno-muchos, muchos-muchos

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

Pycones 2015 SQLObject .connection.debug=True

Slide 25

Slide 25 text

Pycones 2015 SQLObject Many to Many

Slide 26

Slide 26 text

Pycones 2015 Expresiones SQL SQLObject event = Event.select(Event.q.description==description)

Slide 27

Slide 27 text

Pycones 2015 SQLBuilder from sqlobject.sqlbuilder import *

Slide 28

Slide 28 text

Pycones 2015 Generación dinámica A partir de un xml o esquema

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

Pycones 2015 PonyORM db_session decorator

Slide 32

Slide 32 text

Pycones 2015 PonyORM Lambda function

Slide 33

Slide 33 text

Pycones 2015 PonyORM Many to Many

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

Pycones 2015 Django ORM

Slide 36

Slide 36 text

Pycones 2015 Peewee https://github.com/coleifer/peewee • Definición de modelos similar a Django • Patrón ActiveRecord

Slide 37

Slide 37 text

Pycones 2015 Soporte python 3 SQLObject

Slide 38

Slide 38 text

Pycones 2015 Primary key • All create it automatically except SQLAlchemy id = Column(Integer, primary_key=True)

Slide 39

Slide 39 text

Pycones 2015 Autocommit=true db_session SQLObject

Slide 40

Slide 40 text

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'

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

Pycones 2015 Get Data from Caché object = Entity.get(Entity.pk == 'value') object = session.query(Entity).get(pk='value')

Slide 45

Slide 45 text

Pycones 2015 Generating tables • PeeWee db.create_tables([Entity1,Entity2,...,Entityn],True) try: .create_table() except peewee.OperationalError: print “Table already exists!”

Slide 46

Slide 46 text

Pycones 2015 Generating tables SQLObject Base.metadata.create_all(engine) for each Entity: Entity.createTable(ifNotExists=True)

Slide 47

Slide 47 text

Pycones 2015 Generating tables db = Database("sqlite", "ponyORM_pycon.sqlite", create_db=True) class Entity(db.Entity): db.generate_mapping(create_tables=True)

Slide 48

Slide 48 text

Pycones 2015 Herencia • Todas soportan herencia para crear las entidades

Slide 49

Slide 49 text

Pycones 2015 Herencia

Slide 50

Slide 50 text

Pycones 2015 Herencia

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

Pycones 2015 Django security • Binding parameters

Slide 55

Slide 55 text

Pycones 2015 GitHub examples https://github.com/jmortega/pycon-comparing_ORM

Slide 56

Slide 56 text

Pycones 2015 Testing examples http://code.runnable.com/Vk8C1Vkf2dAQGrrc/python-comparing- orm-for-sqlobject-sqlalchemy-ponyorm-and-peewee http://bit.ly/1O9gDn5

Slide 57

Slide 57 text

Pycones 2015 Thank you! ?