pysqlite
发布时间:2020-12-12 20:26:13 所属栏目:百科 来源:网络整理
导读:Python要操作SQLite可以使用Pyslqite模块,最新的模块可以去 http://www.pysqlite.org/ 下载,当初下载的时候顺便简单看了看usage-guide( http://initd.org/pub/software/pysqlite/doc/usage-guide.html ),觉得挺简单的,没有仔细研究便开始考虑编写,我考
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.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,可是当然运行一下这个类时,结果居然出错了: Traceback (most recent call last): File "D:sourcedbconnect.py",line 49,in ? test() File "D:sourcedbconnect.py",line 42,in test temp=test.execute("select * from person") File "D:sourcedbconnect.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.0srccursor.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"错误171819执行传入的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() (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- c# – 转发器内动态控件的viewstate问题
- ruby-on-rails – 将Grunt集成到Rails资产管道中
- ruby-on-rails – Heroku上的Rails check_box表现不正常
- Print2Flash的工作原理与入门使用
- ajax核心代码
- ruby-on-rails – 如何在编辑时停止预先填充的密码字段?
- c# – WINFORM或WPF:如何在发出它的类的构造函数中触发自定
- cocos2dx 2.x定时器分析(1)
- ruby-on-rails – 在capistrano中思考狮身人面像停止(ts:停
- Create Oracle 12c Template Database In Silent