前言

最近在学习python,发现好像没有对pymssql的详细说明,于是乎把官方文档学习一遍,重要部分做个归档,方便自己以后查阅。

pymssql是python用来连接Microsoft SQL Server的一个工具库(package)。其包含两个模块:

  • pymssql:遵从DB-API1规范的接口
  • _mssql:性能更佳、更易于使用

从版本2.1.x起,整个库的实现基于FreeTDS2的db-lib组件。

pymssql的架构如下:

在Windows下的安装很简单,下载安装个相对新版的python,具体来说:

  • Python 2.x: 2.7以上
  • Python 3.x: 3.3以上

然后打开命令行:

pip install pymssql

然后就自动安装上了,好像FreeTDS之后的支持库都会自动帮忙安好。

另外注意为了后面的使用,需要自己安装好Microsoft SQL Server,2005以上的版本。

pymssql模块使用

以下示例程序基于官方的示例,并进行了一定的修改,主要是删改了些代码以及添加了很多注释。

基本使用流程

pymssql的使用十分简单,基本就如下几个步骤

  1. 创建链接:使用connect()创建连接并获取Connection对象
  2. 交互操作:获取Connection对象的Cursor对象,然后使用Cursor对象的各种方法与数据库进行交互
  3. 关闭链接

本章假设你已经配置好环境并且在本地数据库中有一个叫tempdb的数据库,有一个用户的用户名为sa,密码为123456。
以下程序简单示例了上述步骤并创建好了测试用数据库。

import pymssql
#sql服务器名,这里(127.0.0.1)是本地数据库IP
serverName = '127.0.0.1'
#登陆用户名和密码
userName = 'sa'
passWord = '123456'
#建立连接并获取cursor
conn = pymssql.connect(serverName , userName , passWord, "tempdb")
cursor = conn.cursor()
# 创建测试表 persons,包含字段:ID、name、salesrep
cursor.execute("""
IF OBJECT_ID('persons', 'U') IS NOT NULLDROP 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()
# 连接用完后记得关闭以释放资源
conn.close()

后面较为详细的分开讲解下各个步骤

创建连接

因为这篇文章讲的是pymssql模块(如上所述还有一个_mssql模块)所以要import pymssql。

为了创建连接,需要调用pymssql.connect()方法,这个方法会返回一个Connection对象。

用户验证登陆

可能比较常用的就是如上面程序中所用的用户名+密码的登陆方式了:

conn = pymssql.connect(serverName , userName , passWord, "tempdb")

等价于:

conn = pymssql.connect(server = serverName , user = userName , password = passWord, database = "tempdb")

第二种用关键字的方式可以按任意顺序传递各参数(好吧,这其实是python的基础知识)。

Windows身份认证登陆

登陆自己电脑上的数据库时,Windows身份认证的方式登陆是个很好用的方法。因为不需要账号密码:

conn = pymssql.connect(server = serverName , database = "tempdb")

简单来说,只要不填账号密码,就会自动用Windows身份认证的方式来登陆了。

其他几个常用选项

其他选项详见文档。

交互操作

在连接建立成功后,与数据库的交互主要是通过Cursor对象进行的:

cursor = conn.cursor()

提交sql命令

如上示例,sql指令通过execute系列方法来执行:

cursor.execute('sql语句')

调用存储过程

如果要调用存储过程,则使用Cursor对象的callproc方法

# 创建一个存储过程
cursor.execute("""
CREATE PROCEDURE FindPerson@name VARCHAR(100)AS BEGINSELECT * FROM persons WHERE name = @name
END
""")
# 调用上面的存储过程
cursor.callproc('FindPerson', ('Jane Doe',))

提交修改

如果对数据进行了修改,且在连接时没有把autocommit设置为True,则需要手动调用commit进行提交修改。

conn.commit()

获取结果

如果执行的是有返回值的sql语句,则可以通过Cursor对象的fetch系列方法来获取结果,结果默认为元组类型:

# 查询persons表中记录数
cursor.execute("SELECT COUNT(*) FROM persons")
# 结果为3
cnt = cursor.fetchone()[0]

如果返回多条记录,可以像这样遍历所有结果:

cursor.execute('SELECT * FROM persons')
# 遍历输出persons表中所有数据
row = cursor.fetchone()
while row:print("ID=%d, Name=%s" % (row[0], row[1]))row = cursor.fetchone()

或者:

# 这里写sql语句的和上例不完全一样只是为了示例execute的其他用法
cursor.execute('SELECT * FROM persons WHERE salesrep=%s', 'John Doe')
for row in cursor:print('row = %r' % (row,))

如果指定了as_dict为True,则返回结果变为字典类型,这样就能通过列名来访问结果了:

# 除了在建立连接时指定,还可以在这里指定as_dict=True
cursor = conn.cursor(as_dict=True)cursor.execute('SELECT * FROM persons')
for row in cursor:print("ID=%d, Name=%s" % (row['id'], row['name']))

另外,还可以使用fetchmany和fetchall来一次性获取指定数量或者所有的结果。

Cursor对象注意事项

一条链接在任何时候只会有一个Cursor对象处于查询状态,这是因为底层的TDS协议没有客户端侧的Cursor,协议要求客户端在进行下一次查询前先完成上一次的。因此如果你想同时在一个连接上进行两个查询的话可能会出现各种惊喜,也许在使用多线程等方式的时候需要特别注意这点:

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()

关闭链接

操作完成后应该调用close方法来关闭链接并释放资源:

conn.close()

可以使用with语句来处理Connection和cursor对象,这样就不需要手动关闭他们了:

with pymssql.connect(server, user, password, "tempdb") 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']))

文档

如果想要更加详细了解这个模块的话,请移步:
python pymssql - pymssql模块官方文档的翻译_夏日白云的博客-CSDN博客_pymssql

参考文献

[1] Introduction — pymssql 2.1.4 documentation


  1. Python DB-API 是一个规范,它定义了一系列必须的对象和数据库存取方式,以便为各种各样的底层数据库系统和多种多样的数据库接口程序提供一致的访问接口。 ↩︎

  2. FreeTDS是一个程序库,其实现了在Windows、Unix和Linux系统下访问Microsoft SQL Server和Sybase数据库,是TDS(表列数据流 )协议的一个开源实现推荐

转自:python pymssql — pymssql模块使用指南_夏日白云的博客-CSDN博客_pymssql

pymssql模块使用指南相关推荐

  1. python pymssql — pymssql模块使用指南

    pymssql模块使用指南 前言 pymssql模块使用 基本使用流程 创建连接 用户验证登陆 Windows身份认证登陆 其他几个常用选项 交互操作 提交sql命令 调用存储过程 提交修改 获取结果 ...

  2. python cv2模块安装_python 连接sql server数据库,pymssql模块安装。

    python 连接sql server数据库,pymssql模块安装. python版本:python3.7 数据库版本:sql server 2016 连接sql server数据库,本菜鸟用的是p ...

  3. python连接SQL Server取多个结果集:Pymssql模块

    基本的用法可以参考:python连接SQL Server:Pymssql模块 和上一篇文章中的代码,只取一个结果集不同,这次会一次运行2个sql语句,然后分别取出2个结果集,打印输出. 代码中有详细的 ...

  4. 【昊鼎王五】pip安装pymssql模块时报错“PEP 517”怎么解决?

    [昊鼎王五]pip安装pymssql模块时报错"PEP 517"怎么解决? 背景 在https://blog.csdn.net/haoding205/article/details ...

  5. python pip安装pymssql_pip安装pymssql模块时报错“PEP 517”怎样处理

    pip安装pymssql模块时报错"PEP 517"怎样处理? 报错信息 如下图:[root@centos tmp]# pip3 install pymssqlCollecting ...

  6. ROCKCHIP PWM模块开发指南

    ROCKCHIP PWM模块开发指南 前言 脉宽调制(PWM,Pulse Width Modulation)功能在嵌入式系统中是非常常见的,它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效 ...

  7. Remote Execution - SaltStack远程执行模块使用指南

    文章目录 Remote Execution - Salt远程执行模块 Salt Execution Modules Remote execution tutorial - 远程执行模块使用教程 开始管 ...

  8. python连接SQL Server:Pymssql模块

    数据库版本:SQL Server 2012. 按照python版本来选择下载pymssql模块,这样才能连接上sql server. 我安装的python版本是3.5 ,64位的,所以下载的pymss ...

  9. python pymssql - pymssql模块官方文档的翻译

    译者注:译者博客(http://blog.csdn.net/lin_strong),转载请保留这条.此为pymssql模块version2.1.4官方文档的翻译,仅供学习交流使用,请勿用于商业用途. ...

最新文章

  1. 苹果加急审核详细步骤
  2. win 系统配置 openal
  3. 一元操作符“++”,“- ” 之强制转换数值
  4. 德勤加入阿里云原生合作伙伴计划,强强联手开创数字化咨询新风向
  5. 叉乘点乘混合运算公式_期末复习|人教版二年级上册数学概念和公式总结
  6. Python中float(‘inf‘)代表什么意思?
  7. 系统性能衡量维度、指标
  8. 删除超过10亿用户的数据,Facebook 关闭面部识别系统
  9. 服务器性能考察指标,服务器性能考察指标
  10. 关于网站注册账号时提示Server 对象 错误 'ASP 0177 : 800401f3'
  11. [转载] python3 闭包
  12. 面试官:这货一听就是一个水货...
  13. Aloha:一个分布式任务调度框架
  14. ASCII码表对照图
  15. 使用DirectX播放音频数据流
  16. Java 程序员新机必备程序清单
  17. 配置本地DNS服务器地址
  18. 计算公民身份号码校验码(C++)
  19. 【Trailhead题目解析】Prepare your salesforce org for users - 2Update the Exchange Rate with ACM
  20. 苹果电脑键盘没反应_MAC PRO type-c接口无反应,充电无反应或一直在充电解决方案...

热门文章

  1. 【推荐系统】新闻相似度计算
  2. android 夏令时,android修改夏令时
  3. 设计制作计算机组装评论,计算机组装与维护课程设计_new解析.doc
  4. 神经网络计算机硬件,人工神经网络的硬件设计研究
  5. 数码软文营销文案写作的12套公式模板
  6. 科讯CMS--使用sql标签在商品内容页调用品牌详情,如品牌名称,图片,介绍等...
  7. 成功者所应具有的九大素质
  8. Fraps 游戏录像工具
  9. 蔡高厅高等数学 09 函数的左右极限、无穷大量与无穷小量
  10. SpringCloud 生成二维码技术