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 Django模板的使用方法(图文)
Nov 04 Python
Python中zip()函数用法实例教程
Jul 31 Python
解析Python编程中的包结构
Oct 25 Python
Python实现对百度云的文件上传(实例讲解)
Oct 21 Python
Python编程实现二分法和牛顿迭代法求平方根代码
Dec 04 Python
selenium+python 去除启动的黑色cmd窗口方法
May 22 Python
Pycharm 操作Django Model的简单运用方法
May 23 Python
python简单区块链模拟详解
Jul 03 Python
Python3简单爬虫抓取网页图片代码实例
Aug 26 Python
python mqtt 客户端的实现代码实例
Sep 25 Python
Python csv文件记录流程代码解析
Jul 16 Python
Pyecharts 中Geo函数常用参数的用法说明
Feb 01 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实现图片自动清理的方法
2015/07/08 PHP
如何在centos8自定义目录安装php7.3
2019/11/28 PHP
JTrackBar水平拖动效果
2007/07/15 Javascript
jquery 屏蔽一个区域内的所有元素,禁止输入
2009/10/22 Javascript
深入理解javascript学习笔记(一) 编写高质量代码
2012/08/09 Javascript
jQuery根据ID获取input、checkbox、radio、select的示例
2014/08/11 Javascript
AngularJS+Node.js实现在线聊天室
2015/08/28 Javascript
jquery ztree异步搜索(搜叶子)实践
2016/02/25 Javascript
js实现精确到秒的日期选择器完整实例
2016/04/30 Javascript
JS中innerHTML和pasteHTML的区别实例分析
2016/06/22 Javascript
一个超简单的jQuery回调函数例子(分享)
2016/08/08 Javascript
Node.js安装配置图文教程
2017/05/10 Javascript
关于webpack2和模块打包的新手指南(小结)
2017/08/07 Javascript
基于vue-ssr服务端渲染入门详解
2018/01/08 Javascript
web前端vue实现插值文本和输出原始html
2018/01/19 Javascript
video.js 实现视频只能后退不能快进的思路详解
2018/08/09 Javascript
javascript实现计算器功能
2020/03/30 Javascript
《javascript设计模式》学习笔记一:Javascript面向对象程序设计对象成员的定义分析
2020/04/07 Javascript
[57:24]LGD vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
wxpython 学习笔记 第一天
2009/03/16 Python
Python中str.format()详解
2017/03/12 Python
Django与JS交互的示例代码
2017/08/23 Python
python单例模式实例解析
2018/08/28 Python
Python计算信息熵实例
2020/06/18 Python
Django如何实现防止XSS攻击
2020/10/13 Python
css3 按钮样式简单可扩展创建
2013/03/18 HTML / CSS
努比亚手机官网:nubia
2016/10/06 全球购物
全球性的奢侈品梦工厂:Forzieri(福喜利)
2019/02/20 全球购物
暑假实习求职信范文
2013/09/22 职场文书
致铅球运动员广播稿精选
2014/01/12 职场文书
放飞梦想演讲稿
2014/05/05 职场文书
法人代表证明书格式
2014/10/01 职场文书
检讨书怎么写
2015/01/23 职场文书
高中开学感言
2015/08/01 职场文书
安全伴我行主题班会
2015/08/13 职场文书
详解redis在微服务领域的贡献
2021/10/16 Redis