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实现获取操作系统版本信息方法
Apr 08 Python
浅谈python内置变量-reversed(seq)
Jun 21 Python
Python实现学校管理系统
Jan 11 Python
Python使用matplotlib实现的图像读取、切割裁剪功能示例
Apr 28 Python
pandas dataframe的合并实现(append, merge, concat)
Jun 24 Python
python 字符串追加实例
Jul 20 Python
关于Flask项目无法使用公网IP访问的解决方式
Nov 19 Python
Python调用Windows命令打印文件
Feb 07 Python
python数据库编程 ODBC方式实现通讯录
Mar 27 Python
关于jupyter打开之后不能直接跳转到浏览器的解决方式
Apr 13 Python
Python sublime安装及配置过程详解
Jun 29 Python
python温度转换华氏温度实现代码
Dec 06 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中时间轴开发(刚刚、5分钟前、昨天10:23等)
2011/10/03 PHP
php实现session自定义会话处理器的方法
2015/01/27 PHP
php生成年月日下载列表的方法
2015/04/24 PHP
php使用scandir()函数扫描指定目录下所有文件示例
2019/06/08 PHP
使用Javascript和DOM Interfaces来处理HTML
2006/10/09 Javascript
JavaScript下申明对象的几种方法小结
2008/10/02 Javascript
js跨浏览器实现将字符串转化为xml对象的方法
2013/09/25 Javascript
httpclient模拟登陆具体实现(使用js设置cookie)
2013/12/11 Javascript
jQuery中Dom的基本操作小结
2014/01/23 Javascript
async/await与promise(nodejs中的异步操作问题)
2017/03/03 NodeJs
微信小程序 后台登录(非微信账号)实例详解
2017/03/31 Javascript
详解Angular-cli生成组件修改css成less或sass的实例
2017/07/27 Javascript
nodejs之koa2请求示例(GET,POST)
2018/08/07 NodeJs
layuiAdmin循环遍历展示商品图片列表的方法
2019/09/16 Javascript
python正常时间和unix时间戳相互转换的方法
2015/04/23 Python
详解在Python中处理异常的教程
2015/05/24 Python
Python实现读取TXT文件数据并存进内置数据库SQLite3的方法
2017/08/08 Python
python+selenium实现京东自动登录及秒杀功能
2017/11/18 Python
Django中自定义模型管理器(Manager)及方法
2019/09/23 Python
浅谈python print(xx, flush = True) 全网最清晰的解释
2020/02/21 Python
python实现字符串和数字拼接
2020/03/02 Python
PyCharm2020.1.1与Python3.7.7的安装教程图文详解
2020/08/07 Python
基于Python正确读取资源文件
2020/09/14 Python
Numpy ndarray 多维数组对象的使用
2021/02/10 Python
html+css实现自定义图片上传按钮功能
2019/09/04 HTML / CSS
英国山地公路自行车商店:Tweeks Cycles
2018/03/16 全球购物
吉尔德利巧克力公司:Ghirardelli Chocolate Company
2019/03/27 全球购物
劳资专员岗位职责
2013/12/27 职场文书
国际贸易专业个人鉴定
2014/02/22 职场文书
诚信考试承诺书
2014/03/27 职场文书
购房意向书范本
2014/04/01 职场文书
left join、inner join、right join的区别
2021/04/05 MySQL
python使用matplotlib绘制图片时x轴的刻度处理
2021/08/30 Python
详解Python+OpenCV进行基础的图像操作
2022/02/15 Python
python实现手机推送 代码也就10行左右
2022/04/12 Python
利用Apache Common将java对象池化的问题
2022/06/16 Servers