因为一个需求需要用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使用基础