Save 37% off PRO during our Black Friday Sale! »

Povídání o SQLAlchemy

Povídání o SQLAlchemy

Představení knihovny SQLAlchemy. Přednáška pro lednové PyVo 2012.

870d613430249e453343efc9667ef636?s=128

Petr Viktorin

January 28, 2012
Tweet

Transcript

  1. Povídání o SQLAlchemy Petr Viktorin @encukou lednové PyVo 2012 –

    NoSQL
  2. Povídání o SQLAlchemy Petr Viktorin @encukou lednové PyVo 2012 –

    NoSQL (co tu vůbec dělám?)
  3. SQL? To je taková ta zastaralá technologie, ne?

  4. SQL? To je taková ta zastaralá technologie, ne? 1970 –

    relační databáze
  5. SQL? To je taková ta zastaralá technologie, ne? 1970 –

    relační databáze 1979 – SQL
  6. Problémy SQL

  7. Problémy SQL Kompatibilita, standardizace ..?

  8. Problémy SQL Kompatibilita, standardizace ..? Deklarativní jazyk, textový formát

  9. Problémy SQL Kompatibilita, standardizace ..? Deklarativní jazyk, textový formát Pythoní

    DBAPI (PEP 249) má podobné problémy
  10. SQL Nechci psát čisté SQL

  11. SQL Nechci psát čisté SQL Ale

  12. SQL Nechci psát čisté SQL Ale chci používat relační databáze!

  13. “Disproving the myth of ‘the best database layer is the

    one that makes the database invisible’ is a primary philosophy of SA.
  14. “Disproving the myth of ‘the best database layer is the

    one that makes the database invisible’ is a primary philosophy of SA. If you don't want to deal with SQL, then there's little point to using a database in the first place.”
  15. SQLAlchemy Core

  16. SQLAlchemy Core · Definice tabulek · Dotazování

  17. Definice tabulek from sqlalchemy import (Table, Column, Integer, String, MetaData,

    ForeignKey) metadata = MetaData() users = Table('users', metadata, Column('id', Integer, primary_key=True), Column('name', String), Column('fullname', String), ) addresses = Table('addresses', metadata, Column('id', Integer, primary_key=True), Column('user_id', None, ForeignKey('users.id')), Column('email_address', String, nullable=False) )
  18. Dotazování from sqlalchemy import create_engine from sqlalchemy.sql import select engine

    = create_engine('sqlite:///:memory:', echo=True) conn = engine.connect() s = select([users]) result = conn.execute(s) for row in result: print row (1, u'jack', u'Jack Jones') (2, u'wendy', u'Wendy Williams') (3, u'fred', u'Fred Flintstone') (4, u'mary', u'Mary Contrary')
  19. Dotazování s1 = select([users]) s1 = s1.filter(users.c.name == 'fred') s2

    = select([users]) s2 = s2.filter(users.c.id >= 3) s3 = select([users.c.name, users.c.fullname]) s4 = select([users, addresses], users.c.id==addresses.c.user_id)
  20. Dotazování s = select([(users.c.fullname + ", " + addresses.c.email_address).label('title')], and_(

    users.c.id==addresses.c.user_id, users.c.name.between('m', 'z'), or_( addresses.c.email_address.like('%@aol.com'), addresses.c.email_address.like('%@msn.com') ) ) )
  21. Dotazování s = select([(users.c.fullname + ", " + addresses.c.email_address).label('title')], and_(

    users.c.id==addresses.c.user_id, users.c.name.between('m', 'z'), or_( addresses.c.email_address.like('%@aol.com'), addresses.c.email_address.like('%@msn.com') ) ) ) Dotazy a výrazy jsou objekty – dá se s nimi dál pracovat
  22. Ale počkat, nemělo SQLAlchemy být ORM?

  23. Ale počkat, nemělo SQLAlchemy být ORM? Object-Relational Mapper

  24. Architektura SQLAlchemy SQLAlchemy Core SQLAlchemy ORM Object-Relational Mapper Schema, Types

    Expression Language Engine Connection Pool Expression Dialect DBAPI
  25. Deklarativní model from sqlalchemy import Column, Integer, String, ForeignKey from

    sqlalchemy.orm import relationship, backref from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String) fullname = Column(String) class Address(Base): __tablename__ = 'addresses' id = Column(Integer, primary_key=True) user_id = Column(None, ForeignKey('users.id')) email_address = Column(String, nullable=False) user = relationship("User", backref=backref('addresses', order_by=id))
  26. Unit of Work from sqlalchemy.sql import select from sqlalchemy.orm import

    sessionmaker Session = sessionmaker(bind=engine) session = Session() ed_user = User(name='ed', fullname='Ed Jones') session.add(ed_user) session.commit()
  27. Dotazování session.select(User).filter(User.name == 'ed') Opět plné možnosti SQL

  28. ORM je nadstavba nad Core >>> User.__table__ Table('users', MetaData(None), Column('id',

    Integer(), table=<users>, primary_key=True, nullable=False), Column('name', String(), table=<users>), Column('fullname', String(), table=<users>),
  29. “The Tao of SQLAlchemy” SQL databases behave less like object

    collections the more size and performance start to matter Object collections behave less like tables and rows the more abstraction starts to matter
  30. “The Tao of SQLAlchemy” Neschovávat detaily, ale automatizovat

  31. “The Tao of SQLAlchemy” Neschovávat detaily, ale automatizovat Uživatel má

    plnou kontrolu
  32. “The Tao of SQLAlchemy” Neschovávat detaily, ale automatizovat Uživatel má

    plnou kontrolu PEP20 (import this)
  33. Díky za pozornost! Dotazy?

  34. Zdroje http://www.sqlalchemy.org http://spyced.blogspot.com/2009/05/ belated-2009-introduction-to-sqlalchemy.html http://www.sqlalchemy.org/blog/2011/09/19/ sqlalchemy-at-pygotham/ Obrázky na pozadí ©

    Blye Widmar (CC BY-SA 3.0) http://notshurly.deviantart.com/gallery/23303244 Šířeno pod licencí Creative Commons Attribution-ShareAlike 3.0 http://creativecommons.org/licenses/by-sa/3.0/