Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Python Comparing ORM

jmortegac
November 22, 2015

Python Comparing ORM

Python Comparing ORM
SQLalchemy,SQLObject,PonyORM,Peewee,Django ORM

jmortegac

November 22, 2015
Tweet

More Decks by jmortegac

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

  4. 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

    View Slide

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

    View Slide

  6. 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

    View Slide

  7. Pycones 2015
    Patrones ORM
    • Unit of Work

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  12. Pycones 2015
    Soporte Bases datos

    View Slide

  13. Pycones 2015
    Soporte web FrameWorks

    View Slide

  14. Pycones 2015
    Modelo de datos

    View Slide

  15. Pycones 2015
    SQLiteBrowser

    View Slide

  16. Pycones 2015
    SQLiteBrowser

    View Slide

  17. Pycones 2015
    Muchos a muchos

    View Slide

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

    View Slide

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

    View Slide

  20. Pycones 2015
    SQLalchemy Many to many

    View Slide

  21. Pycones 2015
    SQLalchemy
    Query objects

    View Slide

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

    View Slide

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

    View Slide

  24. Pycones 2015
    SQLObject
    .connection.debug=True

    View Slide

  25. Pycones 2015
    SQLObject Many to Many

    View Slide

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

    View Slide

  27. Pycones 2015
    SQLBuilder
    from sqlobject.sqlbuilder import *

    View Slide

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

    View Slide

  29. 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

    View Slide

  30. 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

    View Slide

  31. Pycones 2015
    PonyORM
    db_session decorator

    View Slide

  32. Pycones 2015
    PonyORM
    Lambda function

    View Slide

  33. Pycones 2015
    PonyORM
    Many to Many

    View Slide

  34. 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

    View Slide

  35. Pycones 2015
    Django ORM

    View Slide

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

    View Slide

  37. Pycones 2015
    Soporte python 3
    SQLObject

    View Slide

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

    View Slide

  39. Pycones 2015
    Autocommit=true
    db_session
    SQLObject

    View Slide

  40. 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'

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  48. Pycones 2015
    Herencia
    • Todas soportan herencia para crear las
    entidades

    View Slide

  49. Pycones 2015
    Herencia

    View Slide

  50. Pycones 2015
    Herencia

    View Slide

  51. 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

    View Slide

  52. 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

    View Slide

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

    View Slide

  54. Pycones 2015
    Django security
    • Binding parameters

    View Slide

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

    View Slide

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

    View Slide

  57. Pycones 2015
    Thank you!
    ?

    View Slide