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入门篇之条件、循环
Oct 17 Python
Python进程间通信用法实例
Jun 04 Python
十个Python程序员易犯的错误
Dec 15 Python
Python虚拟环境virtualenv的安装与使用详解
May 28 Python
python使用PyCharm进行远程开发和调试
Nov 02 Python
基于python中的TCP及UDP(详解)
Nov 06 Python
Python实现的连接mssql数据库操作示例
Aug 17 Python
利用Django提供的ModelForm增删改数据的方法
Jan 06 Python
python 字符串常用函数详解
Sep 11 Python
pandas中的ExcelWriter和ExcelFile的实现方法
Apr 24 Python
python 实现rolling和apply函数的向下取值操作
Jun 08 Python
什么是python类属性
Jun 10 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模板之Phpbean的目录结构
2008/01/10 PHP
php调用google接口生成二维码示例
2014/04/28 PHP
php ci框架中加载css和js文件失败的原因及解决方法
2014/07/29 PHP
thinkphp中多表查询中防止数据重复的sql语句(必看)
2016/09/22 PHP
PHP+Redis 消息队列 实现高并发下注册人数统计的实例
2018/01/29 PHP
基于jquery的一个简单的脚本验证插件
2010/04/05 Javascript
深入分析escape()、encodeURI()、encodeURIComponent()的区别及示例
2014/08/04 Javascript
DOM基础教程之事件对象
2015/01/20 Javascript
表单验证正则表达式实例代码详解
2015/11/09 Javascript
全面解析Bootstrap表单使用方法(表单按钮)
2015/11/24 Javascript
怎么限制input的text里输入的值只能是数字(正则、js)
2016/05/16 Javascript
AngularJs  Using $location详解及示例代码
2016/09/02 Javascript
jQuery表单插件ajaxForm实例详解
2017/01/17 Javascript
javascript简写常用的12个技巧(可以大大减少你的js代码量)
2020/03/28 Javascript
微信小程序getPhoneNumber获取用户手机号
2017/09/29 Javascript
webpack3之loader全解析
2017/10/26 Javascript
详解vuex的简单使用
2018/03/12 Javascript
Vue组件中prop属性使用说明实例代码详解
2018/05/31 Javascript
OpenLayers3实现地图显示功能
2020/09/25 Javascript
python使用MySQLdb访问mysql数据库的方法
2015/08/03 Python
Python 处理数据的实例详解
2017/08/10 Python
Python随机生成均匀分布在三角形内或者任意多边形内的点
2017/12/14 Python
Python将DataFrame的某一列作为index的方法
2018/04/08 Python
Python3.4学习笔记之常用操作符,条件分支和循环用法示例
2019/03/01 Python
Python3操作YAML文件格式方法解析
2020/04/10 Python
tensorflow pb to tflite 精度下降详解
2020/05/25 Python
pycharm2020.1.2永久破解激活教程,实测有效
2020/10/29 Python
Html5+JS实现手机摇一摇功能
2015/04/24 HTML / CSS
美国最大的万圣节服装网站:HalloweenCostumes.com
2017/10/12 全球购物
美国著名的家居用品购物网站:Bed Bath & Beyond
2018/01/05 全球购物
UNIX文件名称有什么规定
2013/03/25 面试题
汽车4S店销售经理岗位职责
2015/04/02 职场文书
东京审判观后感
2015/06/01 职场文书
《我们的民族小学》教学反思
2016/02/19 职场文书
解析目标检测之IoU
2021/06/26 Python
css实现左上角飘带效果的完整代码
2022/03/18 HTML / CSS