因为一个需求需要用python连接SQL Server数据库,做一些数据的处理。在网上查了一下,用pymssql来做比较方便。

安装pymssql

一般我喜欢用pip来安装,直接pip install pymssql 但是,不清楚其他平台会不会有问题,mac上会报错,报错类似下面这样:

_mssql.c:266:10: fatal error: 'sqlfront.h' file not found
_mssql.c:18814:15: error: use of undeclared identifier 'DBVERSION_80'

原因是:需要安装freetds,但是又不能用最新版本,必须制定0.91版本,很坑。

brew unlink freetds
brew install freetds@0.91
brew link --force freetds@0.91
pip install pymssql

使用示例

参考下面的示例,还是比较容易上手的。

import pymssql

server = '192.168.99.X'
user = 'sa'
password = 'XXXXXX'
database = 'XXXXXX'         ## 数据库的连接信息

conn = pymssql.connect(server, user, password, database)    ## 创建一个实例
c1 = conn.cursor()              ## 新建一个连接
c1.execute(sql)                 ## 执行sql语句
reslist = c1.fetchall()         ## 获取全部结果

简单封装

下面是网上看到别人写好的一个封装

#coding=utf-8 
#!/usr/bin/env python

import pymssql


class MSSQL:
    """
    使用该库时,需要在Sql Server Configuration Manager里面将TCP/IP协议开启
    """

    def __init__(self,host,user,pwd,db):
        self.host = host
        self.user = user
        self.pwd = pwd
        self.db = db

    def __GetConnect(self):
        """
        得到连接信息
        返回: conn.cursor()
        """
        if not self.db:
            raise(NameError,"没有设置数据库信息")
        self.conn = pymssql.connect(host=self.host,user=self.user,password=self.pwd,database=self.db,charset="utf8")
        cur = self.conn.cursor()
        if not cur:
            raise(NameError,"连接数据库失败")
        else:
            return cur

    def ExecQuery(self,sql):
        """
        执行查询语句
        返回的是一个包含tuple的list,list的元素是记录行,tuple的元素是每行记录的字段

        调用示例:
                ms = MSSQL(host="localhost",user="sa",pwd="123456",db="PythonWeiboStatistics")
                resList = ms.ExecQuery("SELECT id,NickName FROM WeiBoUser")
                for (id,NickName) in resList:
                    print str(id),NickName
        """
        cur = self.__GetConnect()
        cur.execute(sql)
        resList = cur.fetchall()

        #查询完毕后必须关闭连接
        self.conn.close()
        return resList

    def ExecNonQuery(self,sql):
        """
        执行非查询语句

        调用示例:
            cur = self.__GetConnect()
            cur.execute(sql)
            self.conn.commit()
            self.conn.close()
        """
        cur = self.__GetConnect()
        cur.execute(sql)
        self.conn.commit()
        self.conn.close()

def main():
## ms = MSSQL(host="localhost",user="sa",pwd="123456",db="PythonWeiboStatistics")
## #返回的是一个包含tuple的list,list的元素是记录行,tuple的元素是每行记录的字段
## ms.ExecNonQuery("insert into WeiBoUser values('2','3')")

    ms = MSSQL(host="localhost",user="sa",pwd="123456",db="PythonWeiboStatistics")
    resList = ms.ExecQuery("SELECT id,weibocontent FROM WeiBo")
    for (id,weibocontent) in resList:
        print str(weibocontent).decode("utf8")

if __name__ == '__main__':
    main()

参考: python 使用pymssql连接sql server数据库 Python连接SQL Server数据库 - pymssql使用基础