API¶
functions API¶
为了方便使用某些方法,在 settings.ini 中定义了常用的一些API:
- get_model(model, engine_name=None)
返回指定连接的
model
对应的Class。如果是字符串值,则需要根据Model配置的要求在settings.ini 中定义Model的信息才有效果。也可以传入Model的类。 如果engine_name不为None,则根据给定的engine_name来查找Model。如果不存在,则 抛出异常。 如果engine_name为空时,将会智能搜索。如果某个Model只设置了一个数据库连接, 则自动使用这个连接,如果存在多个则会抛出异常。- get_object(model, id, cache=False, use_local=False)
返回某个Model对应的记录。其中 model 为 Model 名,id为对应的记录的id值。如果指定了
cache=True
,则可以从 cache 中获得缓存的值。(它需要与objcache APP相配合,否则无效)如果指定了use_local=True
,则会从本地的内存缓存 中获得值。它不使用cache,是直接使用内存。它可以与cache合用,则访问顺序是: use_local > cache > db- get_cached_object(model, id, cache=True, use_local=True)
它就是
get_object()
的一个简写。
配置相关 API¶
uliweb.orm 提供了一些配置相关的 API,用于控制整个uliorm的工作模式。不过,如果 你不是在脱离uliweb的框架环境下来使用orm模块的话,以下的一些方法在settings.ini 中有相应的配置,因此不需要去手工调用相应的函数。但如果是在其它的非uliweb的环境 下使用uliorm,则有可能需要手工调用这些函数来控制uliorm的行为。
- set_auto_create(flag)
设置是否自动建表。flag取值为True或False。缺省为False。这一功能在开发时比较 有用,因为可以不使用uliweb syncdb来建表,但是在生产环境中建议关闭,手动来 处理。
在使用sqlite时,发现有问题。当处于一个事务中,如果出现非select, update 之类的语句,sqlite会自动提交事务,造成事务处理不是按你的预期,所以也需 要关闭这个功能。
- set_debug_query(flag)
设置调试模式。如果flag为True,则生成的SQL语句将输出到日志中。如果你是通过
get_connection()
得到的一个数据库连接对象,可以简单地设置db.echo = True
来激活调试模式。- set_encoding(encoding)
设置缺省编码。缺省为
utf-8
。
常用 API¶
- get_connection(connection='', engine_name='default', connection_type='long', **args)
建立一个数据库连接,并返回连接对象。
connection需要按SQLAlchemy的要求来编写。 get_connection既可以支持原来的单数据库连接模式,也可以支持多数据库连接模式, 还可以通过
engine_name
来直接使用某个定义好的连接。- local_connection(engine_name=None, auto_transaction=False): conn
返回缓存的数据库连接。如果不存在,则创建。
auto_transaction
是用来控制 是否自动创建事务。- Connect(engine_name=None): None
清除缓存的线程连接,保证下次再访问时可以重建连接。
- Begin(ec=None): transaction object
开始一个事务。如果存在线程连接对象同时如果不存在当前线程内的连接对象,则自动从连接池中取一个连接 并绑定到当前线程环境中。ec为数据库引擎对象名,如果没提供,则缺省为 'default'. ec也可以为连接对象。
- Commit(ec=None, trans=None)
提交一个事务。使用当前线程的连接对象。
- CommitAll()
提交所有线程事务。
- Rollback(ec=None, trans=None)
回滚一个事务。使用当前线程的连接对象。
- RollbackAll()
回滚所有线程事务。
- do_(sql, ec=None)
执行一条SQL语句。使用当前的线程连接。只有当使用非ORM的API时才需要使用它 来处理,比如直接使用SQLAlchemy提供的:select, update, delete, insert时,可 以这样:
from uliweb.orm import do_ result = do_(select(User.c, User.c.username=='limodou'))
也可以直接写SQL语句,如:
result = do_('select * from user')
- set_echo(flag, time=None, explain=False, caller=True, session=None)
用于控制当执行
do_
时是否显示底层的SQL语句的开关函数.time
表示当执行超过指定时间时才显示,否则总显示explain
表示是否自动执行EXPLAIN SQL
caller
表示是否显示上层调用的函数session
表示是否显示执行时的session名字
- reflect_table(tablename, engine_name='default')
用于直接从数据库中获得某张表对象 (Table)
- reflect_table_data(tablename, engine_name='default')
获得某张表的结构化数据.返回一个
dict
,形式为:{'columns':{}, 'indexes':[]}
其中
columns
是一个有序字典,分别对应表中的每个字段.形式为:'column_name':('type', {ATTRS})
- reflect_table_model(tablename, engine_name='default')
直接将某个表转为 Model 的类形式.
常用Class¶
- Bulk (0.5b1)
用于简化直接使用原始SQL进行查询/修改等处理.在批量操作情况下,使用ORM性能效低,所以可以考虑使用原始的 SQL.同时为了更加简化,也没有直接使用SQLAlchemy的Select,而是使用了更底层的SQL+占位符的形式.使用Bulk 有以下几个特性:
- 可以预先根据输入的SQL转为占位符的形式
- 可以设置批量操作的大小,当缓存数据达到大小时,一次性提交,提高性能
- 根据预编译好的SQL计算点位符的顺序,根据传入的数据进行匹配,用于数据执行时
- 支持:select, update, insert ,delete的处理
- 提供
put
用于批量提交数据,do_
用于逐条运行 ,prepare
用于准备SQL - 提供
close
来提交未处理的数据 - 支持内置事务,缺省使用提用者事务
b = Bulk(size=10) b.prepare('insert', User.table.insert().values(username='username', year='year')) b.put('insert', username='u1', year=12) b.put('insert', username='u2', year=13) b.close()
b = Bulk() b.prepare('select', User.table.select().where(User.c.username=='username')) print b.do_('select', username='u3').fetchone()