#
!/usr/bin/python
# -*-coding:UTF-8-*- $Id:dbconnect.py82006-04-0814:21:32ZAdministrator$
importConfigParser
importlocale
frompysqlite2 importdbapi2assqlite
classsqliteConnection:
def __init__(self,dbname):
"""
初始化数据库连接
"""
self.conn=sqlite.connect(dbname)
defexecute(self,sql):
执行传入的sql语句,返回一个元组或者None
"""
self.cu=self.conn.cursor()
self.cu.execute(sql)
self.conn.commit()
self.rows=[]
forself.row inself.cu:
self.rows.append(self.row)
returnself.rows
__del__(self):
关闭数据库连接 """
self.conn.close()
deftest():
测试方法 """
config=ConfigParser.ConfigParser()
config.read( ' config ')
dbname=config.get( sqliteDB ',filename ')
test=sqliteConnection( " :memory: ")
test.execute( createtableperson(lastname,firstname) insertintoperson(lastname,firstname)values('三','张') ")
if __name__== __main__ ':
test()
之前简单试过一下访问sqlite一切OK,可是当然运行一下这个类时,结果居然出错了:
# -*-coding:UTF-8-*- $Id:dbconnect.py82006-04-0814:21:32ZAdministrator$
importConfigParser
importlocale
frompysqlite2 importdbapi2assqlite
classsqliteConnection:
def __init__(self,dbname):
"""
初始化数据库连接
"""
self.conn=sqlite.connect(dbname)
defexecute(self,sql):
执行传入的sql语句,返回一个元组或者None
"""
self.cu=self.conn.cursor()
self.cu.execute(sql)
self.conn.commit()
self.rows=[]
forself.row inself.cu:
self.rows.append(self.row)
returnself.rows
__del__(self):
关闭数据库连接 """
self.conn.close()
deftest():
测试方法 """
config=ConfigParser.ConfigParser()
config.read( ' config ')
dbname=config.get( sqliteDB ',filename ')
test=sqliteConnection( " :memory: ")
test.execute( createtableperson(lastname,firstname) insertintoperson(lastname,firstname)values('三','张') ")
if __name__== __main__ ':
test()
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.py82006-04-0814:21:32ZAdministrator$4importConfigParser
5importlocale
6frompysqlite2importdbapi2assqlite
7
8classsqliteConnection:
9
10def11"""12初始化数据库连接
13"""
14self.conn=sqlite.connect(dbname)
15self.conn.row_factory=sqlite.Row加上这句才能使用列名来返回值16self.conn.text_factory=str加上这一句,否则出现"CouldnotdecodetoUTF-8column"错误17sql):
1819执行传入的sql语句,返回一个元组或者None
2021self.cu=self.conn.cursor()
22self.cu.execute(sql)
23self.conn.commit()
24
25self.rows=[]
26forself.rowinself.cu:
27self.rows.append(self.row)
28returnself.rows
29__del__(self):
30关闭数据库连接31self.conn.close()
32deftest():
33测试方法34config=ConfigParser.ConfigParser()
35config.read('config')
36dbname=config.get(sqliteDBfilename37
38test=sqliteConnection(":memory:")
39test.execute(40test.execute(41test.execute(42temp=test.execute(select*fromperson43printtemp
44encoding=locale.getdefaultlocale()[1]
45printstr(第一条记录:').decode(encoding)+str(temp[0][1]).decode(encoding)+str(temp[0][0]).decode(encoding)
46第二条记录:').decode(encoding)+str(temp[1][1]).decode(encoding)+str(temp[1][0]).decode(encoding)
47assertstr(temp[0][1]).decode(encoding)+str(temp[0][0]).decode(encoding)==str(张三").decode(encoding)
48if__name__==__main__':
49test()