Follower me on GitHub

本文主要是ORM的sission查询和更新

session负责执行内存中的对象和数据库表之间的同步工作,创建session可以这样:

Session = sessionmaker(bind=engine) #sqlalchemy.orm.session.Session类有很多参数,使用sessionmaker是为了简化这个过程

或者: Session = sessionmaker() Session.configure(bind=engine)

注:sessionmaker的参数: autoflush=True  #为True时,session将在执行session的任何查询前自动调用flush()。这将确保返回的结果

transactional=False #为True时,session将自动使用事务commit twophase=False #当处理多个数据库实例,当使用flush()但是没有提交事务commit时,给每个数据库一个标识,使整个事务回滚

创建session,添加数据的例子(以前也出现过很多次了) dongwm@localhost ~ $ python Python 2.7.3 (default, Jul 11 2012, 10:10:17) [GCC 4.5.3] on linux2 Type “help”, “copyright”, “credits” or “license” for more information. >>> from sqlalchemy import * >>> from sqlalchemy.orm import * >>> engine = create_engine(‘sqlite://’) >>> metadata = MetaData(engine) >>> account_table = Table( … ‘account’, metadata, … Column(‘id’, Integer, primary_key=True), … Column(‘balance’, Numeric)) >>> class Account(object): pass … >>> mapper(Account, account_table) <Mapper at 0x84e6f2c; Account> >>> account_table.create() >>> a = Account() >>> a.balance = 100.00 >>> Session = sessionmaker(bind=engine) >>> session = Session() >>> session.add(a) >>> session.flush() >>> session.delete(a) #自动删除 account_table相应条目,但是在1:N和M:N关系中不会自动删除它的级联关系 >>> session.flush()

注:session的对象状态:

Transient:短暂的,主要指内存中的对象

Pending:挂起的,这样的对象准备插入数据库,等执行了flush就会插入

Persistent:持久的

Detached:对象在数据库里面有记录,但是不属于session

>>> make_transient(a)  #因为标识了已删除,恢复a的状态 >>> session.add(a) #重新添加 >>> session.flush() >>> query = session.query(Account) >>> print query SELECT account.id AS account_id, account.balance AS account_balance FROM account >>> for obj in query: …     print obj … <__main__.Account object at 0x84eef0c>

>>> query.all()  #查询所有 [<__main__.Account object at 0x84eef0c>] >>> query = query.filter(Account.balance > 10.00)  #filter过滤 >>> for obj in query: …     print obj.balance …

100.00

>>> for i in session.query(Account).filter_by(balance=100.00 ):  #通过条件过滤 …     print i >>> query = session.query(Account) >>> query = query.from_statement(‘select *from account where balance=:bac’) #通过带通配符的SQL语句其中:bac标识这个参数是bac >>> query = query.params(bac=’100.00’) #根据bac指定值寻找 >>> print query.all() [<__main__.Account object at 0x84eef0c>]

本地session

>>> Session = scoped_session(sessionmaker(  #设置一个本地的共享session …     bind=engine, autoflush=True)) >>> session = Session() >>> session2 = Session() >>> session is session2  #他们是同一个 True

>>> a = Account() >>> a.balance = 100.00 >>> Session.add(a) #注意 这是的’S’是大写 >>> Session.flush() >>> b = Account() >>> a.balance = 200.00 >>> session.add(a)  #其实他们是一个共享的session 名字都可以 >>> session.flush() >>> print session.query(Account).all() #查询到了2个 [<__main__.Account object at 0x851be0c>, <__main__.Account object at 0x84f7d6c>]

注:这样的映射mapper也可以这样是用:

mapper(Product, product_table, properties=dict( categories=relation(Category, secondary=product_category_table, backref=’products’)))

Session.mapper(Product, product_table, properties=dict( categories=relation(Category, secondary=product_category_table, backref=’products’))) #它的优点是可以初始化参数