前一篇文章PySqlite简明教程介绍了使用 PySqlite 的一些基本命令,下面我再结合DB-API介绍一些使用PySqlite可做的其它一些操作。使用的示例续上一篇文章。首先,在我的示例中catalog表中有3条记录:
0|0|name2
1|0|name3
2|0|name4
1. 创建索引
在PySqlite中可以创建索引,如:
>>> cu.execute("create index catalog_idx on catalog(id asc)")
>>> cu.commit()
这样我们就创建了一个使用id作为键值的索引。索引的使用完全是由sqlite来处理的,也就是说当你的查询语句中的条件与索引相关时,sqlite就会使用这个索引。
2. 统计表中记录的条数
>>> cu.execute("select count(*) from catalog")
>>> cu.fetchone()
(3.0,)
搞不清为什么是个浮点数?
3. 取结果集记录条数
>>> cu.execute("select * from catalog")
>>> cu.rowcount
3
4. 指定每次从结果集中取出记录的条数
>>> cu.execute("select * from catalog")
>>> cu.fetchmany(2)
[(0, 0, 'name2'), (1, 0, 'name3')]
>>> cu.fetchmany(2)
[(2, 0, 'name4')]
可以看出fetchmany中的参数是用来指明一次取多少条记录的。如果不指明,缺省为1。你也可以修改这个缺省值,只要:
>>> cu.arraysize = 2
>>> cu.execute("select * from catalog")
>>> cu.fetchmany()
[(0, 0, 'name2'), (1, 0, 'name3')]
5. 滚动游标
PySqlite有scroll方法,可以在结果集中进行滚动。
游标对象有一个属性为current_recnum表示当前在结果集中的索引,如:
>>> cu.execute("select * from catalog")
>>> cu.current_recnum
0
>>> cu.fetchone()
(0, 0, 'name2')
>>> cu.current_recnum
1
scroll是cursor的一个方法:scroll(value, mode)
mode有两种取值:'relative'表示相对位置,'absolute'表示绝对位置。当mode为'relative'时,value表示从当前位置开始后移动几条记录。mode缺省为'relative'。
>>> cu.execute("select * from catalog")
>>> cu.scroll(2)
>>> cu.current_recnum
2
>>> cu.fetchone()
(2, 0, 'name4')
当mode为'absolute'时,value表示从第一记录开始的记录位置。
>>> cu.scroll(0, mode='absolute')
>>> cu.fetchone()
(0, 0, 'name2')
6. 可重用的SQL语句
这里可重用一般包含两个意思:一是,这种SQL语句基本上没有变化,只有条件中的具体取值可以变化。二是,数据库引擎只对这种语句进行一次翻译处 理,下一次直接使用翻译后的东西进行处理,这样减少了翻译守程,可以提高执行效率。不过这种重用只适合于条件固定的语句。在sqlite中,我感到只对有 条件的语句有效,如果不带条件或条件是固定的,不知道还有没有这种特性,对于这一点我没有太深入下去。
>>> SQL = "select * from catalog where id = %(id)s"
>>> cu.execute(SQL, dict(id=2))
>>> cu.fetchall()
[(2, 0, 'name4')]
>>> cu.execute(SQL, dict(id=1))
>>> cu.fetchall()
[(1, 0, 'name3')]
从上面可以看出,可重用的SQL语句的执行也是通过execute方法来执行的,不过后面跟着参数--一个字典。为什么是字典?不同的DB模块使用不同的参数语法。使用哪种语法,可以通过查询DB模块的paramstyle参数来访问,以下是几种类型的说明:
qmark WHERE NAME=?
numeric WHERE NAME=.1
named WHERE NAME=.name
format WHERE NAME=%s
pyformat WHERE NAME=%(name)s
而PySqlite使用的正是pyformat,因此,参数需要是一个字典。
7. 关于数据库的信息
PySqlite是符合DB-API的标准的,通过查询模块变量apilevel可以得知PySqlite实现的是DB-API的哪一个标准,现在DB-API有两个标准:1.0和2.0。而PySqlite实现的是2.0
8. 其它说明
所有的fetch*语句在读出数据后,当前记录索引都会向后移动,因此想要重新再进行处理的话,一种是重新执行查询语句,再有就是使用scroll()方法重新定位记录索引的位置。
好象pysqlite查询出的所有记录都放在内存中,这样当数据非常大时,是不是会占用非常多的内存,这一点还不是很清楚,我也没有测试过。
以上是结合pysqlite来说明DB-API的使用,并不全,只可作为一个参考。许多东西大家可以自行测试。
Trackback: http://tb.donews.net/TrackBack.aspx?PostId=40733
(阅读次数:)