当前位置:网站首页 > SQL数据库编程 > 正文

pymssql连接数据库 报错(py连接mysql数据库)



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=[,,,,,,,]
   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: General SQL Server error: Check messages from the SQL Server ")

@注意事项:

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'做事',), (u'作为实现',), (u'佐照龙',)],[]代表查询的结果集数组,里边的圆括号表示的是一行一行的数据,圆括号内逗号隔开的是一列一列的数据。

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

到此这篇pymssql连接数据库 报错(py连接mysql数据库)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • mysql 和 oracle(mysql和oracle的区别有什么)2024-12-27 18:09:09
  • mysql主键的数据类型(mysql数据库主键什么类型)2024-12-27 18:09:09
  • plsql12注册码(plsql12注册码永久可用)2024-12-27 18:09:09
  • mysql锁表如何解锁(mysql锁表和解锁语句)2024-12-27 18:09:09
  • sqlldr 导入clob(sqlldr导入clob)2024-12-27 18:09:09
  • sql文件格式化在线(sql 文件格式)2024-12-27 18:09:09
  • plsql注册码过期(plsql注册码永久)2024-12-27 18:09:09
  • mysql主键查询快还是索引查询快(mysql主键和索引)2024-12-27 18:09:09
  • jdbc连接数据库增删改查(jdbc连接mysql数据库增删改查代码)2024-12-27 18:09:09
  • pymysql的基本使用(pymssql)2024-12-27 18:09:09
  • 全屏图片