0,首先在电脑中安装pymssql库,该库可以到这里下载:http://www.lfd.uci.edu/~gohlke/pythonlibs/#pymssql

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

1,下面是连接和查询Sql数据库类(底层访问类---通用,有了它就可以随意访问数据库了,主要包含一些访问数据库的函数):

import pymssql

 

class MSSQL:
    def __init__(self,host,user,pwd,db): #类的构造函数,初始化数据库连接ip或者域名,以及用户名,密码,要连接的数据库名称
        self.host=host
        self.user=user
        self.pwd=pwd
        self.db=db
    def __GetConnect(self):  #得到数据库连接信息函数, 返回: conn.cursor()
        if not self.db:
            rasie(NameError,"没有设置数据库信息")
        self.conn=pymssql.connect(host=self.host,user=self.user,password=self.pwd,database=self.db,charset='utf8')
        cur=self.conn.cursor()  #将数据库连接信息,赋值给cur。
        if not cur:
            raise(NameError,"连接数据库失败")
        else:
            return cur

    #执行查询语句,返回的是一个包含tuple的list,list的元素是记录行,tuple的元素是每行记录的字段
    def ExecQuery(self,sql):  #执行Sql语句函数,返回结果
        cur = self.__GetConnect()   #获得数据库连接信息
        cur.execute(sql)  #执行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()

2,下面在函数中,连接数据库,并执行一个简单的查询语句(查):

def main():
    ms=MSSQL(host="117.79.156.45",user="cswutong",pwd="cjsys!@#",db="CsWutong")  #实例化类对象,连接数据对象
    reslist=ms.ExecQuery("select top 10 id,c_value from dbo.bx_categories AS bc")   #调用函数执行查询语句
    for(id,huiyuancontent) in reslist:     #遍历返回结果
        print huiyuancontent         #转换为字符串,打印出来。

 

3,下面是一个超微复杂点的查询语句(查):

def main():
    ms=MSSQL(host="117.79.156.40",user="wutongview",pwd="*******",db="Wutong")
    lst2=[]  #声明列表,Python中没有数组这个概念
    lst=[569454,1405892,1062101,647328,1221889,1255607,1268513,1282851]
    for i in lst:  #遍历列表
        reslist=ms.ExecQuery("SELECT com_name FROM com WHERE cust_id='"+str(i)+"'")  #Python可以用这种加号拼接,也可以用占位符和format进行字符串格式化拼接
        if len(reslist)==0:   #如果查询的结果集数组为空,直接添加数据库查询结果集,否则,添加结果集中的第一行第一列的值,即reslist[0][0]
            lst2.append(reslist)  
            #print("第一个为空")
            #break   #break可以跳出循环
        else:
            lst2.append(reslist[0][0])  
    return lst2  #返回列表

 

4,下面是插入数据(增)操作:

def insert():
    ms=MSSQL(host="117.79.156.45",user="cswutong",pwd="cjsys!@#",db="CsWutong")
    back_val=ms.ExecNonQuery("INSERT dbo.bx_xyzBackContent ( backmsg, time )   VALUES  ( N'nihaoceshi','2014-04-02 13:55:27')")  #注意,这里back_val为None值。
    return back_val

 

5,下面是删除(删)操作:

 def delete():
    ms=MSSQL(host="117.79.156.45",user="cswutong",pwd="cjsys!@#",db="CsWutong")
    back_val=ms.ExecNonQuery("DELETE FROM dbo.bx_xyzBackContent WHERE id='6333'")  #注意,这里back_val为None值。
    return back_val

 

6,下面是更新(改)操作:

def update():
    ms=MSSQL(host="117.79.156.45",user="cswutong",pwd="cjsys!@#",db="CsWutong")
    back_val=ms.ExecNonQuery("UPDATE dbo.bx_xyzBackContent SET backmsg='nihaotest' WHERE id=6331")   #注意,这里back_val为None值。
    return back_val

 

7,执行存储过程:

cur.execute("exec 存储过程名 @参数1=XXX, @参数2='YYY'......")

***一个真实的案例:

def main():
    ms=MSSQL(host="192.168.0.156",user="view",pwd="*********",db="Wutong")  
    reslist=ms.ExecQuery("exec SearchBshi @fromProvince='',@fromCity='',@fromArea='',@companyAddress='',@intPageNo=1,@intPageSize=10")
    return reslist  #这里,返回的也是查询结果集,就像一张临时表,处理方法和上边一样。

---前提,你的账号要有执行存储过程的权限,否则会报下边错误:

OperationalError: (229, "The EXECUTE permission was denied on the object 'SearchBshi', database 'Wutong', schema 'dbo'.DB-Lib error message 229, severity 14:\nGeneral SQL Server error: Check messages from the SQL Server\n")

 

 

@注意事项:

1,使用pymssql进行中文操作时候可能会出现中文乱码,我解决的方案是:

  • 文件头加上 #coding=utf8
  • sql语句中有中文的时候进行encode
    = "insert into WeiBo([UserId],[WeiBoContent],[PublishDate]) values(1,'测试','2012/2/1')".encode("utf8")
  •  连接的时候加入charset设置信息
    =self.host,user=self.user,password=self.pwd,database=self.db,charset="utf8")

2,print str(huiyuancontent),不要加str,会报编码错误。用unicode(huiyuancontent)。

3,注意Sql语句,查询返回的结果值处理问题。reslist=ms.ExecQuery("select top 10 id,c_value from dbo.bx_categories AS bc")

这里reslist是一个数组对象[(u'\u505a\u4e8b',), (u'\u4f5c\u4e3a\u5b9e\u73b0',), (u'\u4f50\u7167\u9f99',)],[]代表查询的结果集数组,里边的圆括号表示的是一行一行的数据,圆括号内逗号隔开的是一列一列的数据。

---最主要,是我们取值的时候,要取对应的值。假如我取结果集中第一行第一列的值,那就是reslist[0][0]