Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Python Comparing ORM

1,409 views

Published on

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

Published in: Data & Analytics
  • Be the first to comment

Python Comparing ORM

  1. 1. Pycones 2015 Python Comparing ORM José manuel ortega |@jmortegac
  2. 2. Pycones 2015 https://speakerdeck.com/jmortega https://medium.com/@jmortegac
  3. 3. Pycones 2015 • Introducción a ORM • ORM en Python • SqlAlchemy/SQLObject/PonyORM/Peewee/Django-ORM • Comparativa • Seguridad Agenda
  4. 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
  5. 5. Pycones 2015 Introducción a ORM • Mapeo: • ClaseTabla • AtributoColumna • ObjetoFila
  6. 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
  7. 7. Pycones 2015 Patrones ORM • Unit of Work
  8. 8. Pycones 2015 Patrones ORM • Identity Map • Caché de objetos Objetos en BD Objetos en memoria
  9. 9. Pycones 2015 Introducción a ORM • Patrones: • Active Record Pattern • Relacion 1:1 Object Table /row
  10. 10. Pycones 2015 Introducción a ORM • Patrones: • Data Mapper Pattern Object DataMaper Database
  11. 11. Pycones 2015 ORM en python SELECT * FROM USERS WHERE zip_code=94107; users = Users.objects.filter(zip_code=94107)
  12. 12. Pycones 2015 Soporte Bases datos
  13. 13. Pycones 2015 Soporte web FrameWorks
  14. 14. Pycones 2015 Modelo de datos
  15. 15. Pycones 2015 SQLiteBrowser
  16. 16. Pycones 2015 SQLiteBrowser
  17. 17. Pycones 2015 Muchos a muchos
  18. 18. Pycones 2015 SQLalchemy • Es de los más avanzados • Más flexible para el programador • Patrón unit of Work
  19. 19. Pycones 2015 SQLalchemy • Objeto session para persistir los objetos • session.commit()
  20. 20. Pycones 2015 SQLalchemy Many to many
  21. 21. Pycones 2015 SQLalchemy Query objects
  22. 22. Pycones 2015 SQLObject http://sqlobject.org • No es necesario commit • Soporta joins • Relaciones uno-muchos, muchos-muchos
  23. 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")
  24. 24. Pycones 2015 SQLObject <Nombre_clase>.connection.debug=True
  25. 25. Pycones 2015 SQLObject Many to Many
  26. 26. Pycones 2015 Expresiones SQL SQLObject event = Event.select(Event.q.description==description)
  27. 27. Pycones 2015 SQLBuilder from sqlobject.sqlbuilder import *
  28. 28. Pycones 2015 Generación dinámica A partir de un xml o esquema
  29. 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
  30. 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
  31. 31. Pycones 2015 PonyORM db_session decorator
  32. 32. Pycones 2015 PonyORM Lambda function
  33. 33. Pycones 2015 PonyORM Many to Many
  34. 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
  35. 35. Pycones 2015 Django ORM
  36. 36. Pycones 2015 Peewee https://github.com/coleifer/peewee • Definición de modelos similar a Django • Patrón ActiveRecord
  37. 37. Pycones 2015 Soporte python 3 SQLObject
  38. 38. Pycones 2015 Primary key • All create it automatically except SQLAlchemy id = Column(Integer, primary_key=True)
  39. 39. Pycones 2015 Autocommit=true db_session SQLObject
  40. 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'
  41. 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()
  42. 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()
  43. 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)]
  44. 44. Pycones 2015 Get Data from Caché object = Entity.get(Entity.pk == 'value') object = session.query(Entity).get(pk='value')
  45. 45. Pycones 2015 Generating tables • PeeWee db.create_tables([Entity1,Entity2,...,Entityn],True) try: <Entity>.create_table() except peewee.OperationalError: print “Table already exists!”
  46. 46. Pycones 2015 Generating tables SQLObject Base.metadata.create_all(engine) for each Entity: Entity.createTable(ifNotExists=True)
  47. 47. Pycones 2015 Generating tables db = Database("sqlite", "ponyORM_pycon.sqlite", create_db=True) class Entity(db.Entity): db.generate_mapping(create_tables=True)
  48. 48. Pycones 2015 Herencia • Todas soportan herencia para crear las entidades
  49. 49. Pycones 2015 Herencia
  50. 50. Pycones 2015 Herencia
  51. 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
  52. 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
  53. 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))
  54. 54. Pycones 2015 Django security • Binding parameters
  55. 55. Pycones 2015 GitHub examples https://github.com/jmortega/pycon-comparing_ORM
  56. 56. Pycones 2015 Testing examples http://code.runnable.com/Vk8C1Vkf2dAQGrrc/python-comparing- orm-for-sqlobject-sqlalchemy-ponyorm-and-peewee http://bit.ly/1O9gDn5
  57. 57. Pycones 2015 Thank you! ?

×