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实现的一个p2p文件传输实例
Jun 04 Python
Python 爬虫多线程详解及实例代码
Oct 08 Python
Python中多个数组行合并及列合并的方法总结
Apr 12 Python
Python基于递归算法实现的汉诺塔与Fibonacci数列示例
Apr 18 Python
Python实现调用另一个路径下py文件中的函数方法总结
Jun 07 Python
Python 2.7中文显示与处理方法
Jul 16 Python
python文件操作之批量修改文件后缀名的方法
Aug 10 Python
Windows 64位下python3安装nltk模块
Sep 19 Python
Puppeteer使用示例详解
Jun 20 Python
Python中如何将一个类方法变为多个方法
Dec 30 Python
Python实现多线程下载脚本的示例代码
Apr 03 Python
pyecharts调整图例与各板块的位置间距实例
May 16 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
造势之举?韩国总统候选人发布《星际争霸》地图
2017/04/22 星际争霸
Discuz板块横排显示图片的实现方法
2007/05/28 PHP
php站内搜索并高亮显示关键字的实现代码
2011/12/29 PHP
一个简单的网页密码登陆php代码
2012/07/17 PHP
在yii中新增一个用户验证的方法详解
2013/06/20 PHP
ThinkPHP模板之变量输出、自定义函数与判断语句用法
2014/11/01 PHP
php解析非标准json、非规范json的方式实例
2020/12/10 PHP
JQuery实现用户名无刷新验证的小例子
2013/03/22 Javascript
javascript 实现字符串反转的三种方法
2013/11/23 Javascript
ExtJS判断IE浏览器类型的方法
2014/02/10 Javascript
jQuery+CSS3实现树叶飘落特效
2015/02/01 Javascript
jQuery插件datepicker 日期连续选择
2015/06/12 Javascript
JavaScript编程中布尔对象的基本使用
2015/10/25 Javascript
Nodejs中Express 常用中间件 body-parser 实现解析
2017/05/22 NodeJs
vue.js删除列表中的一行
2018/06/30 Javascript
解决vue-cli3 使用子目录部署问题
2018/07/19 Javascript
jQuery解析json格式数据示例
2018/09/01 jQuery
mpvue项目中使用第三方UI组件库的方法
2018/09/30 Javascript
javascript 数组(list)添加/删除的实现
2020/12/17 Javascript
Django在win10下的安装并创建工程
2017/11/20 Python
python 获取list特定元素下标的实例讲解
2018/04/09 Python
Python实现将Excel转换成xml的方法示例
2018/08/25 Python
Flask框架学习笔记之表单基础介绍与表单提交方式
2019/08/12 Python
python自动生成sql语句的脚本
2021/02/24 Python
python matplotlib工具栏源码探析三之添加、删除自定义工具项的案例详解
2021/02/25 Python
HTML5拖放API实现自动生成相框功能
2020/04/07 HTML / CSS
澳大利亚珠宝商:Shiels
2019/10/06 全球购物
JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?
2015/10/22 面试题
中学生获奖感言
2014/02/04 职场文书
新年抽奖获奖感言
2014/03/02 职场文书
城管执法人员纪律作风整顿思想汇报
2014/09/13 职场文书
大学生党员个人对照检查材料范文
2014/09/25 职场文书
党干部专题民主生活会对照检查材料思想汇报
2014/10/06 职场文书
大学生见习报告范文
2014/11/03 职场文书
2016年“12.4”法制宣传日活动总结
2016/04/01 职场文书
标会主持词应该怎么写?
2019/08/15 职场文书