Sqlite China  
首页 | 各种语言的sqlite编程 |sqlite研究 | sqlite应用实例与杂谈 | sqlite相关下载 | SQlite论坛
当前位置 : 主页>各种语言的sqlite编程>列表
使用PySQLite连接SQLite遇到的问题与解决方法
来源:工友 作者:工友 时间:2007-12-21
    Python要操作SQLite可以使用Pyslqite模块,最新的模块可以去http://www.pysqlite.org/下载,当初下载的时候顺便简单看了看usage-guide(http://initd.org/pub/software/pysqlite/doc/usage-guide.html), 觉得挺简单的,没有仔细研究便开始考虑编写,我考虑把sqlite的访问写成一个类,在类的初始化和销毁时候分别建立连接和关闭连接,然后再添加一个执行 sql语句的方法,由于传入的sql可能没有返回值也可能有返回值,而返回的值可能是单列值也可能是多条记录,基于这种复杂情况,就让这个方法返回一个列 表,管它返回什么,通通加到列表中然后返回,我觉得在这一点上,python比其它语言方便多了。下面是这个类:
#!/usr/bin/python
#
 -*- coding: UTF-8 -*-
#
 $Id: dbconnect.py 8 2006-04-08 14:21:32Z Administrator $
import ConfigParser
import locale
from pysqlite2 import dbapi2 as sqlite

class SqliteConnection:
    
    
def __init__(self,dbname):
        
"""
        初始化数据库连接
         
"""        
        self.conn 
= sqlite.connect(dbname)
    
def execute(self,sql):
        
"""
        执行传入的sql语句,返回一个元组或者None
        
"""
        self.cu
=self.conn.cursor()
        self.cu.execute(sql)
        self.conn.commit()

        self.rows
=[]
        
for self.row in self.cu:
            self.rows.append(self.row)
        
return self.rows
    
def __del__(self):
        
"""关闭数据库连接"""
        self.conn.close()
def test():
    
"""测试方法"""
    config
=ConfigParser.ConfigParser()
    config.read(
'config')
    dbname
=config.get('SQLiteDB','filename')
    
    test
= SqliteConnection(":memory:")
    test.execute(
"create table person(lastname, firstname)")
    test.execute(
"insert into person(lastname,firstname) values('三','张')")
    test.execute(
"insert into person(lastname,firstname) values('四','李')")
if __name__=='__main__':
    test()
之前简单试过一下访问sqlite一切OK,可是当然运行一下这个类时,结果居然出错了:
Traceback (most recent call last):
  File "D:\source\dbconnect.py", line 49, in
?
    test()
  File "D:\source\dbconnect.py", line 42, in
test
    temp=test.execute("select * from person")
  File "D:\source\dbconnect.py", line 22, in
execute
    self.cu.execute(sql)
pysqlite2.dbapi2.OperationalError: Could not decode to UTF-8 column firstname wi
th text 张
既然出错了,那么大概是这几种情况:
1.pysqlite不支持中文
2.sqlite不支持中文
3.代码出了问题
出错之后,经过测试,排除第1和2两种可能,
    于是我仔细简单代码,可还是没有找到出错原因,于是想查看pysqlite源代码,可是他的代码是封闭在一个pyd的二进制文件中的,没办法查看,于是去 下载pysqlite的源代码,拿到源代码后在pysqlite-2.2.0\src\cursor.c这个代码中找到了 OperationalError错误类型,知道原来是字符转换时出这个错。于是我就试试将返回值转为可是我弄了很久都没有弄好,在网上google一下 也没有找到这方面的资料,找了一天了也没有找到解决的办法,无奈之下险些泄气。虽然之前看过pysqlite文档,但看得不仔细,只是简单浏览,当时只是 想这东西应该挺简单的,例子也够详细就没有花太多时间去看文档,为得也是节省时间。现在遇到问题了,还是老老实实仔细看看pysqlite文档吧。果然不 枉我滴着眼药水把它看完,终于找到原因了,原来pysqlite中有个con.text_factory可以解决这个问题,这个参数默认值是unicode ,现在只需要把它设置成str就可以了:

 1#!/usr/bin/python
 2# -*- coding: UTF-8 -*-
 3# $Id: dbconnect.py 8 2006-04-08 14:21:32Z Administrator $
 4import ConfigParser
 5import locale
 6from pysqlite2 import dbapi2 as sqlite
 7
 8class SqliteConnection:
 9    
10    def __init__(self,dbname):
11        """
12        初始化数据库连接
13        """        
14        self.conn = sqlite.connect(dbname)
15        self.conn.row_factory = sqlite.Row #加上这句才能使用列名来返回值
16        self.conn.text_factory=str #加上这一句,否则出现"Could not decode to UTF-8 column"错误
17    def execute(self,sql):
18        """
19        执行传入的sql语句,返回一个元组或者None
20        """
21        self.cu=self.conn.cursor()
22        self.cu.execute(sql)
23        self.conn.commit()
24
25        self.rows=[]
26        for self.row in self.cu:
27            self.rows.append(self.row)
28        return self.rows
29    def __del__(self):
30        """关闭数据库连接"""
31        self.conn.close()
32def test():
33    """测试方法"""
34    config=ConfigParser.ConfigParser()
35    config.read('config')
36    dbname=config.get('SQLiteDB','filename')
37    
38    test= SqliteConnection(":memory:")
39    test.execute("create table person(lastname, firstname)")
40    test.execute("insert into person(lastname,firstname) values('三','张')")
41    test.execute("insert into person(lastname,firstname) values('四','李')")
42    temp=test.execute("select * from person")
43    print temp
44    encoding = locale.getdefaultlocale()[1]
45    print str('第一条记录:').decode(encoding)+str(temp[0][1]).decode(encoding)+str(temp[0][0]).decode(encoding)
46    print str('第二条记录:').decode(encoding)+str(temp[1][1]).decode(encoding)+str(temp[1][0]).decode(encoding)
47    assert str(temp[0][1]).decode(encoding)+str(temp[0][0]).decode(encoding)==str("张三").decode(encoding)
48if __name__=='__main__':
49    test()
(阅读次数:
上一篇:用python访问sqlite 下一篇:PHP中如何使用sqlite_create_function函数
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]
用户名: 新注册) 密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
§最新评论
热点文章
·简单的在Java中使用SQLite
·C/C++中调用SQLITE3的基本
·PHP+SQLITE制作简单的视频
·DISQLite3 简介 SQLite de
·VB.NET 中使用 SQLite3 的
·SQLiteJDBC 100%纯JAVA的s
·如何在Windows下编译SQLit
·关于SQLite的一些简单介绍
·在VC6.0中使用C++访问sqli
·C/C++中调用SQLITE3的基本
·SQLite 与 PHP 结合开发(
·在VC6.0中使用C++访问sqli
·使用SQLite进行网站搜索
·SQLite ADO.NET 驱动(C#
·在.NET C#中使用sqlite
·python模块之sqlite数据库
·PHP中的SQlite数据库应用
·如何在PHP5中通过PDO连接S
·PHP中如何使用sqlite_crea
·SQLite 、 PHP混合扩展编
相关文章
·让你的PHP4也用上Sqlite3
·VB.NET 中使用 SQLite3 的
·C/C++中调用SQLITE3的基本
·python模块之sqlite数据库
·在.NET C#中使用sqlite
·用Ruby进行SQLite的开发指
·PHP5中的 sqlite_create_f
·SQLite ADO.NET 驱动(C#
·使用SQLite进行网站搜索
·如何在Windows下编译SQLit

版权Power by DedeCms   后台登陆
Copyright @ 2007