Python连接Mssql基础教程之Python库pymssql


Posted in Python onSeptember 16, 2018

前言

pymssql模块是用于sql server数据库(一种数据库通用接口标准)的连接。另外pyodbc不仅限于SQL server,还包括Oracle,MySQL,Access,Excel等。

另外除了pymssql,pyodbc还有其他几种连接SQL server的模块,感兴趣的可以在这里找到:https://wiki.python.org/moin/SQL%20Server

本文将详细介绍关于Python连接Mssql之Python库pymssql的相关内容,下面话不多说了,来一起看看详细的介绍吧

连接数据库

pymssql连接数据库的方式和使用sqlite的方式基本相同:

  • 使用connect创建连接对象
  • connect.cursor创建游标对象,SQL语句的执行基本都在游标上进行
  • cursor.executeXXX方法执行SQL语句,cursor.fetchXXX获取查询结果等
  • 调用close方法关闭游标cursor和数据库连接
import pymssql

# server  数据库服务器名称或IP
# user   用户名
# password 密码
# database 数据库名称
conn = pymssql.connect(server, user, password, database)

cursor = conn.cursor()

# 新建、插入操作
cursor.execute("""
IF OBJECT_ID('persons', 'U') IS NOT NULL
  DROP TABLE persons
CREATE TABLE persons (
  id INT NOT NULL,
  name VARCHAR(100),
  salesrep VARCHAR(100),
  PRIMARY KEY(id)
)
""")
cursor.executemany(
  "INSERT INTO persons VALUES (%d, %s, %s)",
  [(1, 'John Smith', 'John Doe'),
   (2, 'Jane Doe', 'Joe Dog'),
   (3, 'Mike T.', 'Sarah H.')])
# 如果没有指定autocommit属性为True的话就需要调用commit()方法
conn.commit()

# 查询操作
cursor.execute('SELECT * FROM persons WHERE salesrep=%s', 'John Doe')
row = cursor.fetchone()
while row:
  print("ID=%d, Name=%s" % (row[0], row[1]))
  row = cursor.fetchone()

# 也可以使用for循环来迭代查询结果
# for row in cursor:
#   print("ID=%d, Name=%s" % (row[0], row[1]))

# 关闭连接
conn.close()

注意: 例子中查询操作的参数使用的%s而不是'%s',若参数值是字符串,在执行语句时会自动添加单引号

游标使用注意事项

一个连接一次只能有一个游标的查询处于活跃状态,如下:

c1 = conn.cursor()
c1.execute('SELECT * FROM persons')

c2 = conn.cursor()
c2.execute('SELECT * FROM persons WHERE salesrep=%s', 'John Doe')

print( "all persons" )
print( c1.fetchall() ) # 显示出的是c2游标查询出来的结果

print( "John Doe" )
print( c2.fetchall() ) # 不会有任何结果

为了避免上述的问题可以使用以下两种方式:

  • 创建多个连接来保证多个查询可以并行执行在不同连接的游标上
  • 使用fetchall方法获取到游标查询结果之后再执行下一个查询, 如下:
c1.execute('SELECT ...')
c1_list = c1.fetchall()

c2.execute('SELECT ...')
c2_list = c2.fetchall()

游标返回行为字典变量

上述例子中游标获取的查询结果的每一行为元组类型,

可以通过在创建游标时指定as_dict参数来使游标返回字典变量,

字典中的键为数据表的列名

conn = pymssql.connect(server, user, password, database)
cursor = conn.cursor(as_dict=True)

cursor.execute('SELECT * FROM persons WHERE salesrep=%s', 'John Doe')
for row in cursor:
 print("ID=%d, Name=%s" % (row['id'], row['name']))

conn.close()

使用with语句(上下文管理器)

可以通过使用with语句来省去显示的调用close方法关闭连接和游标

with pymssql.connect(server, user, password, database) as conn:
 with conn.cursor(as_dict=True) as cursor:
  cursor.execute('SELECT * FROM persons WHERE salesrep=%s', 'John Doe')
  for row in cursor:
   print("ID=%d, Name=%s" % (row['id'], row['name']))

调用存储过程

pymssql 2.0.0以上的版本可以通过cursor.callproc方法来调用存储过程

with pymssql.connect(server, user, password, database) as conn:
 with conn.cursor(as_dict=True) as cursor:
  # 创建存储过程
  cursor.execute("""
  CREATE PROCEDURE FindPerson
   @name VARCHAR(100)
  AS BEGIN
   SELECT * FROM persons WHERE name = @name
  END
  """)

  # 调用存储过程
  cursor.callproc('FindPerson', ('Jane Doe',))
  for row in cursor:
   print("ID=%d, Name=%s" % (row['id'], row['name']))

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

参考:http://pymssql.org/en/stable/pymssql_examples.html

Python 相关文章推荐
Python比较两个图片相似度的方法
Mar 13 Python
python扫描proxy并获取可用代理ip的实例
Aug 07 Python
基于Python函数的作用域规则和闭包(详解)
Nov 29 Python
Python实现的计数排序算法示例
Nov 29 Python
django 通过ajax完成邮箱用户注册、激活账号的方法
Apr 17 Python
Python基于dom操作xml数据的方法示例
May 12 Python
Flask核心机制之上下文源码剖析
Dec 25 Python
Python之NumPy(axis=0 与axis=1)区分详解
May 27 Python
python如何使用socketserver模块实现并发聊天
Dec 14 Python
Python实现鼠标自动在屏幕上随机移动功能
Mar 14 Python
Python Dict找出value大于某值或key大于某值的所有项方式
Jun 05 Python
Python classmethod装饰器原理及用法解析
Oct 17 Python
python将秒数转化为时间格式的实例
Sep 16 #Python
Python日期时间模块datetime详解与Python 日期时间的比较,计算实例代码
Sep 14 #Python
编写多线程Python服务器 最适合基础
Sep 14 #Python
不管你的Python报什么错,用这个模块就能正常运行
Sep 14 #Python
Python文件读写保存操作的示例代码
Sep 14 #Python
python一键去抖音视频水印工具
Sep 14 #Python
python入门:这篇文章带你直接学会python
Sep 14 #Python
You might like
你可能不知道PHP get_meta_tags()函数
2014/05/12 PHP
PHP的error_reporting错误级别变量对照表
2014/07/08 PHP
PHP获取文件相对路径的方法
2015/02/26 PHP
js判断浏览器的比较全的代码
2007/02/13 Javascript
javascript禁用Tab键脚本实例
2013/11/22 Javascript
JavaScript编程学习技巧汇总
2016/02/21 Javascript
全国省市二级联动下拉菜单 js版
2016/05/10 Javascript
jquery ajax局部加载方法详解(实现代码)
2016/05/12 Javascript
ReactNative-JS 调用原生方法实例代码
2016/10/08 Javascript
JavaScript简单生成 N~M 之间随机数的方法
2017/01/13 Javascript
全面介绍vue 全家桶和项目实例
2017/12/27 Javascript
nodejs爬虫初试superagent和cheerio
2018/03/05 NodeJs
jQuery模拟12306城市选择框功能简单实现方法示例
2018/08/13 jQuery
基于Vue+Webpack拆分路由文件实现管理
2020/11/16 Javascript
[03:12]2016完美“圣”典风云人物:单车专访
2016/12/02 DOTA
[00:30]明星选手化身超级英雄!2018DOTA2亚洲邀请赛全明星赛来临!
2018/04/06 DOTA
[06:59]DOTA2-DPC中国联赛3月7日Recap集锦
2021/03/11 DOTA
Python使用while循环花式打印乘法表
2019/01/28 Python
详解Python3中ceil()函数用法
2019/02/19 Python
Django项目使用CircleCI的方法示例
2019/07/14 Python
Python银行系统实战源码
2019/10/25 Python
Python打开文件、文件读写操作、with方式、文件常用函数实例分析
2020/01/07 Python
python操作docx写入内容,并控制文本的字体颜色
2020/02/13 Python
html5+css3之制作header实例与更新
2020/12/21 HTML / CSS
html5读取本地文件示例代码
2014/04/22 HTML / CSS
英国著名的小众美容品牌网站:Alyaka
2017/08/08 全球购物
JACK & JONES英国官方网站:欧洲领先的男装生产商
2017/09/27 全球购物
沙特阿拉伯电子产品和家用电器购物网站:Black Box
2019/07/24 全球购物
六道php面试题附答案
2014/06/05 面试题
数控技术应用个人求职信范文
2014/02/03 职场文书
医药营销个人求职信范文
2014/02/07 职场文书
护士岗位职责
2014/02/16 职场文书
学生自我鉴定格式及范文
2014/09/16 职场文书
2014年无财产无子女离婚协议书范本
2014/10/09 职场文书
2015年公司行政后勤工作总结
2015/05/20 职场文书
婚庆主持词大全
2015/06/30 职场文书