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 07 Python
python高手之路python处理excel文件(方法汇总)
Jan 07 Python
基于Python实现对PDF文件的OCR识别
Aug 05 Python
Python生成随机密码的方法
Jun 16 Python
Django如何自定义分页
Sep 25 Python
Python创建字典的八种方式
Feb 27 Python
Python基本数据结构与用法详解【列表、元组、集合、字典】
Mar 23 Python
使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件及出现问题解决方法
Sep 06 Python
Python:合并两个numpy矩阵的实现
Dec 02 Python
Python文本处理简单易懂方法解析
Dec 19 Python
Python制作简易版小工具之计算天数的实现思路
Feb 13 Python
工程师必须了解的LRU缓存淘汰算法以及python实现过程
Oct 15 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
zen cart新进商品的随机排序修改方法
2010/09/10 PHP
探讨:使用XMLSerialize 序列化与反序列化
2013/06/08 PHP
php下载文件源代码(强制任意文件格式下载)
2014/05/09 PHP
php格式化电话号码的方法
2015/04/24 PHP
javascript Zifa FormValid 0.1表单验证 代码打包下载
2007/06/08 Javascript
关于IE7 IE8弹出窗口顶上
2008/12/22 Javascript
Javascript 强制类型转换函数
2009/05/17 Javascript
解决3.01版的jquery.form.js中文乱码问题的解决方法
2012/03/08 Javascript
Jquery倒计时源码分享
2014/05/16 Javascript
js 加密压缩出现bug解决方案
2014/11/25 Javascript
Bootstrap文件上传组件之bootstrap fileinput
2016/11/25 Javascript
jQuery实现jQuery-form.js实现异步上传文件
2017/04/28 jQuery
vuejs使用$emit和$on进行组件之间的传值的示例
2017/10/04 Javascript
vue生命周期的探索
2019/04/03 Javascript
[01:45]IMBATV TI4前线报道-选手到达
2014/07/07 DOTA
[00:34]拔城逐梦,热血永恒!2020(秋)完美世界城市挑战赛报名开启
2020/10/09 DOTA
Python写的创建文件夹自定义函数mkdir()
2014/08/25 Python
redis之django-redis的简单缓存使用
2018/06/07 Python
python 文件查找及内容匹配方法
2018/10/25 Python
python3+selenium实现126邮箱登陆并发送邮件功能
2019/01/23 Python
Python-接口开发入门解析
2019/08/01 Python
TensorFlow——Checkpoint为模型添加检查点的实例
2020/01/21 Python
Python如何访问字符串中的值
2020/02/09 Python
Python闭包与装饰器原理及实例解析
2020/04/30 Python
HTML5之web workers_动力节点Java学院整理
2017/07/17 HTML / CSS
利达恒信公司.NET笔试题面试题
2016/03/05 面试题
家长学校实施方案
2014/03/15 职场文书
计算机网络专业求职信
2014/06/05 职场文书
小学关爱留守儿童活动方案
2014/08/25 职场文书
民主评议政风行风整改方案
2014/09/17 职场文书
校长师德师风自我剖析材料
2014/09/29 职场文书
2014年中学生检讨书大全
2014/10/09 职场文书
2014年文艺部工作总结
2014/11/17 职场文书
喜迎建国70周年:有关爱国的名言名句
2019/09/24 职场文书
分位数回归模型quantile regeression应用详解及示例教程
2021/11/02 Python
利用Python将list列表写入文件并读取的方法汇总
2022/03/25 Python