from sqlalchemy import create_engine
# vytvoření enginu pro SQLite
engine = create_engine('sqlite:///:memory:')
# vytvoření enginu pro MySQL
engine = create_engine(
'mysql://scott:tiger@localhost/test',
isolation_level='READ UNCOMMITTED', # úroveň izolace
)
# vytvoření enginu pro PostgreSQL
engine = create_engine('postgresql+pg8000://scott:tiger@localhost/test')# katalog všech definovaných tabulek
metadata = MetaData()
# definice tabulky users
users = Table('users', metadata,
Column('id', Integer, primary_key=True),
Column('name', String),
Column('fullname', String),
)
# vytvoření tabulek (CREATE TABLE ...)
metadata.create_all(engine)
# otevření nového spojení spojení k DB
conn = engine.connect()
# vytvoření nového uživatele
conn.execute(users.insert().values(name='jan', fullname='Jan Novak'))# katalog všech definovaných tabulek
Base = declarative_base()
# definice modelu users (dědí Base)
class User(Base):
id = Column(Integer, primary_key=True)
name = Column(String)
fullname = Column(String)
# vytvoření tabulek (CREATE TABLE ...)
Base.metadata.create_all(engine)
# vytvoření modelu uživatele
user = User(name='jan', fullname='Jan Novak')
# přidání do session (další slide) a commit
session.add(user)
session.commit(user)# příprava továrny
session_factory = sessionmaker(bind=engine)
# vytvoření nové session
session = session_factory()
# scoped session!
session = scoped_session(session_factory)session.query(User).filter(User.name == 'prema')session.query(User).filter(User.name == 'prema')session.query(User).filter(~User.name.like('%kar%')session.query(User).filter(User.name == 'prema')session.query(User).filter(~User.name.like('%kar%')session.query(Eshop).group_by(Eshop.user_id).having(func.count('*') > 4))session.query(User).all()session.query(User).all()session.query(User).first()
session.query(User).get(24) # podle primárního klíčesession.query(User).all()session.query(User).first()
session.query(User).get(24) # podle primárního klíčefor user in session.query(User):
print(user.name)# s načtením celého objektu do paměti
user.name = 'mergado'
session.add(user)
session.commit()
# bez načtení do paměti
session.query(User).filter(User.id == 23).update({User.name: 'mergado'})# s načtením celého objektu do paměti
user.name = 'mergado'
session.add(user)
session.commit()
# bez načtení do paměti
session.query(User).filter(User.id == 23).update({User.name: 'mergado'})# s načtením celého objektu do paměti
session.delete(user)
session.commit()
# bez načtení do paměti
session.query(User).filter(User.id == 23).delete()definice pomocí relationship
class User(Base):
# ...
eshops = relationship(Eshop) # one to many
user = sessinon.query(User).get(2)
for eshop in user.eshops:
print(eshop.name)definice pomocí relationship
class User(Base):
# ...
eshops = relationship(Eshop) # one to many
user = sessinon.query(User).get(2)
for eshop in user.eshops:
print(eshop.name)# SELECT user.* FROM user INNER JOIN eshop ...
session.query(User).join(Eshop).filter(Eshop.name = 'Mironet.cz')
# SELECT project.*, log.* FROM project INNER JOIN log ...
session.query(Project, Log).join(Log, Project.id == Log.wtf_id)
# SELECT project.* FROM project LEFT OUTER JOIN log ...
session.query(Project).outerjoin(Log, Project.id == Log.wtf_id)UNION, INTERSECT, WITH, ...
subqueries
pracnější je CREATE VIEW
query = session.query(all_columns()) # vznikne KeyedTuple
for Model in models:
columns = get_columns(Model)
query = query.outerjoin(
Model,
pg.and_(cls.set_id == Model.set_id,
cls.item_id == Model.item_id)
).add_columns(*columns)
return queryUNION, INTERSECT, WITH, ...
subqueries
pracnější je CREATE VIEW
spojení tabulek ve for-cyklu:
Twitter/GitHub: @paveldedik