Python连接SQLServer2000的方法详解
本文详细介绍如何使用Python通过pymssql模块连接SQLServer2000数据库。内容涵盖模块安装、连接建立、游标创建、SQL命令执行及结果提取等标准流程。重点解决了开发中常见的GBK转UTF-8时出现的UnicodeDecodeError乱码问题,提供ignore和replace等错误处理策略,帮助开发者高效完成数据库交互。
本文分享一个利用Python连接SQLServer2000数据库的具体实现方案,供读者参考学习。
访问 http://pymssql.sourceforge.net/ 可以获取关于Python连接MSSQL的详细信息与资源。
Python的一大优势在于拥有丰富的现成模块库,开发者可直接下载并使用,从而加速开发进程。本文重点探讨pymssql模块的具体操作功能。
安装模块后,建议查阅其官方帮助文档以了解各项功能细节。
1. 解决编码乱码问题的方法:
s.decode('gbk', 'ignore')
例如,若需将字符串对象s从GBK编码转换为UTF-8,常规操作如下:
s.decode('gbk').encode('utf-8')
然而在实际开发中,笔者发现该方法常引发异常报错:
UnicodeDecodeError: 'gbk' codec can't decode bytes in position 30664-30665: illegal multibyte sequence
此错误源于遇到了非法字符。特别是在部分由C/C++编写的程序中,全角空格可能存在多种实现方式,如\xa3\xa0或\xa4\x57。尽管视觉上均为全角空格,但它们并非“合法”的全角空格(合法的全角空格编码为\xa1\xa1),导致在转码过程中抛出异常。
幸运的是,通过查阅文档找到了完美的解决方案(此前因未仔细阅读文档而受批评)。
s.decode('gbk', 'ignore').encode('utf-8')
由于decode函数的原型为decode([encoding], [errors='strict']),可以通过第二个参数控制错误处理策略。默认参数strict表示遇到非法字符时抛出异常;
若设置为ignore,则忽略非法字符; 若设置为replace,则使用?替换非法字符; 若设置为xmlcharrefreplace,则使用XML字符引用。
此方法非常实用,可有效解决数据库中存储的全角与半角非法字符导致的编码问题。
字符编码问题始终是开发中的难点,需特别注意。
2. 参考 http://www.python.org/dev/peps/pep-0249/
该链接提供了Python DB-API的常用操作规范。
以下是总结的相关API操作方法:
3. Python连接数据库的一般程序流程如下:
第一步:导入相关模块
对于MYSQL数据库:
import MySQLdb
对于MSSQL数据库:
import pymssql
第二步:打开数据库连接
对于MYSQL数据库:
conn = MySQLdb.connect(self.dbhost,self.dbuser,self.dbpasswd,self.database)
对于MSSQL数据库:
conn = pymssql.connect(host=self.dbhost,user=self.dbuser,password=self.dbpasswd,database=self.database)
(此处通过函数原型定义连接方法)
第三步:建立连接后,需创建一个cursor(游标)对象,通过该对象向数据库发送请求操作。
代码示例如下:
curs = conn.cursor()
这相当于Java中的Statement对象,通过语句提交SQL命令。
第四步:向数据库服务器发送SQL命令,操作方式如下:
curs.execute(SQL)
例如:
curs.execute("select * from test")
其中的SQL命令可以是任意合法的SQL语句,包括执行INSERT、DELETE或SELECT操作。
需要注意的是,执行完毕后必须调用commit()方法进行提交。
例如:
cursor.execute("insert into test(id) values(1)")
若执行的是SELECT操作,则需进行第五步操作:
第五步:
curs.execute("select * from test")
rows = curs.fetchall()
其中的fetchall()仅是cursor对象的一个方法。
此时即可提取相关信息。
for i in range(len(rows)): print "Row",i,"name",rows[i][0],"value",rows[i][1]
查看笔者编写的代码:
def test(self):
conn = self.connect()
sql="select * from bbs where id<20"
curs = conn.cursor() #得到一个游标对象
curs.execute(sql) #执行一个SQL语句
rows=curs.fetchall() #得到全部的查询结果集
for i in range(len(rows)): #
print "Row",i,"name",rows[i][3],"value",rows[i][4]
conn.close()
经分析可知,通过该方法获取的一行记录实际上是一个元组(tuple)数据结构。
若要提取其中特定值,可使用类似二维数组的索引方法进行查询。
rows[1][0]表示获取第一条记录中第一个位置的数值。
接下来,查看从数据库提取数据后的编码处理与解码处理过程。
for i in range(len(rows)):
print rows[i][4].decode('gb2312', 'ignore').encode('gb2312')
今后操作数据库时,可直接参照此代码编写。
详细帮助说明文档可参考 http://pymssql.sourceforge.net/userguide.html。
更多关于Python的相关内容,感兴趣的读者可查看本站专题:《Python常见数据库操作技巧汇总》、《Python编码操作技巧总结》、《Python图片操作技巧总结》、《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》。
希望本文所述的Python程序设计内容能对读者有所帮助。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









