前一篇文章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的使用,并不全,只可作为一个参考。许多东西大家可以自行测试。


3条评论

  1. 嗯嗯!方便是方便,但是没有象MySQL 哪样的简单操作界面?

    用字典的方式来看每次查询的结果很累哪!

    在进行数据库设计时希望有简单扼要的方式可以进行SQL 测试是也乎^^

  2. 如果你在命令行下执行.explain ON,就会显示得好看一些。

    不知道你还要进行什么测试,如果是商用或大数据量的应用现在来说我想还不合适。

  3. sqlite也支持tcl,但想必基于python的会更方便使用。

    sqlite基于文件读写,性能不是太好,记得当初的测试是15条/s左右

发表评论

评论也有版权!