Python连接SQLServer2000的方法详解

Chloe
Chloe
发布时间:2026-10-13 | 3人浏览过
原创

本文详细介绍如何使用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程序设计内容能对读者有所帮助。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表