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 相关文章推荐
使用graphics.py实现2048小游戏
Mar 10 Python
python通过字典dict判断指定键值是否存在的方法
Mar 21 Python
Python实现PS滤镜碎片特效功能示例
Jan 24 Python
python 实现对数据集的归一化的方法(0-1之间)
Jul 17 Python
Python最小二乘法矩阵
Jan 02 Python
详解python中init方法和随机数方法
Mar 13 Python
画pytorch模型图,以及参数计算的方法
Aug 17 Python
python pyenv多版本管理工具的使用
Dec 23 Python
Python对称的二叉树多种思路实现方法
Feb 28 Python
Numpy 理解ndarray对象的示例代码
Apr 03 Python
关于python中模块和重载的问题
Nov 02 Python
Python 中面向接口编程
May 20 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
一个多文件上传的例子(原创)
2006/10/09 PHP
搜索引擎技术核心揭密
2006/10/09 PHP
新手学PHP之数据库操作详解及乱码解决!
2007/01/02 PHP
php 分页类 扩展代码
2009/06/11 PHP
php中几种常见安全设置详解
2010/04/06 PHP
详解Grunt插件之LiveReload实现页面自动刷新(两种方案)
2015/07/31 PHP
PHP+MySQL实现消息队列的方法分析
2018/05/09 PHP
PHP面向对象程序设计之接口的继承定义与用法详解
2018/12/20 PHP
javascript常用函数(1)
2015/11/04 Javascript
深入探讨前端框架react
2015/12/09 Javascript
sencha ext js 6 快速入门(必看)
2016/06/01 Javascript
再谈Javascript中的异步以及如何异步
2016/08/19 Javascript
JavaScript中的return布尔值的用法和原理解析
2017/08/14 Javascript
一篇文章让你彻底弄懂JS的事件冒泡和事件捕获
2017/08/14 Javascript
JavaScript数据类型的存储方法详解
2017/08/25 Javascript
React Native模块之Permissions权限申请的实例相机
2017/09/28 Javascript
vue图片上传本地预览组件使用详解
2019/02/20 Javascript
uniapp 仿微信的右边下拉选择弹出框的实现代码
2020/07/12 Javascript
微信小程序实现拼图小游戏
2020/10/22 Javascript
Python 连连看连接算法
2008/11/22 Python
python中urllib模块用法实例详解
2014/11/19 Python
解决安装python库时windows error5 报错的问题
2018/10/21 Python
利用nohup来开启python文件的方法
2019/01/14 Python
详解pandas中iloc, loc和ix的区别和联系
2020/03/09 Python
序列化Python对象的方法
2020/08/01 Python
贝嫂喜欢的婴儿品牌,个性化的婴儿礼物:My 1st Years
2017/11/19 全球购物
日本快乐生活方式购物网站:Shop Japan
2018/07/17 全球购物
武汉高蓝德国际.net机试
2016/06/24 面试题
历史学专业大学生找工作的自我评价
2013/10/16 职场文书
触摸春天教学反思
2014/02/03 职场文书
初一学生评语大全
2014/04/24 职场文书
2014年小学英语教师工作总
2014/12/03 职场文书
MySQL 数据恢复的多种方法汇总
2021/06/21 MySQL
【2·13】一图读懂中国无线电发展
2022/02/18 无线电
以MySQL5.7为例了解一下执行计划
2022/04/13 MySQL
css3手动实现pc端横向滚动
2022/06/21 HTML / CSS