python pymssql_python pymssql — pymssql模块使用指南

2023-10-27

前言

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

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

_mssql:性能更佳、更易于使用

从版本2.1.x起,整个库的实现基于FreeTDS

pymssql的架构如下:

在Windows下的安装很简单,下载安装个相对新版的python,具体来说:Python 2.x: 2.7以上

Python 3.x: 3.3以上

然后打开命令行:pip install pymssql

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

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

pymssql模块使用

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

基本使用流程

pymssql的使用十分简单,基本就如下几个步骤创建链接:使用connect()创建连接并获取Connection对象

交互操作:获取Connection对象的Cursor对象,然后使用Cursor对象的各种方法与数据库进行交互

关闭链接

本章假设你已经配置好环境并且在本地数据库中有一个叫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 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()

# 连接用完后记得关闭以释放资源

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身份认证的方式来登陆了。

其他几个常用选项database(str):指定的是默认数据库,如果不需要的话,上述例子中其实可以不写。但是这样的话,那你的SQL语句中就得在最前面加上"USE tempdb ……"了,sql server用的多的应该知道怎么回事。

as_dict(bool) :如果设置为True,则后面的查询结果返回的是字典,关键字为查询结果的列名;否则(默认)返回的为list。

autocommit(bool):默认为False,这样如果对数据表进行更改,则需要手动调用commit来提交操作。

port(str):指定服务器的TCP端口,如果你没有改过的话使用默认的就好。

其他选项详见文档。

交互操作

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

提交sql命令

如上示例,sql指令通过execute系列方法来执行:cursor.execute('sql语句')

调用存储过程

如果要调用存储过程,则使用Cursor对象的callproc方法# 创建一个存储过程

cursor.execute("""

CREATE PROCEDURE FindPerson

@name VARCHAR(100)

AS BEGIN

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python pymssql_python pymssql — pymssql模块使用指南 的相关文章

  • Unity导入模型UnityPacket

    asset gt import package gt import custom package
  • C++ 代码评审最终指南——第 1 部分

    C 语言功能强大 但也极其复杂 复杂性使其极易引发误解和过度复杂化 相比简单语言 C 中的程序错误难以发现 相比其他语言 生产环境中的 C 程序错误更难定位 简而言之 需要谨慎处理 C 甚至是用鹰眼那样锐利的目光进行评审 本篇分为两部分 第
  • 前端鉴权如何做

    登录接鉴权 用户名密码 gt 客户端 gt login gt 服务端 gt 比对数据库 gt 数据库返回数据 gt 服务端 gt 返回数据 gt 给客户端 鉴权 基础鉴权 session cookie JWT Oauth 算法加密 Base
  • eclipse 中Maven项目 的maven install 、build 、clean

    自己在对maven项目打成war包的时候 首先是maven clean 之后maven build的时候出现报错 说找不到该项目下的target 文件 具体的英文我就不复制了 自己倒腾了好长的时间 最后maven install一下皆可以了
  • windows/Linux c++ 获取CMD指令执行的返回结果

    无论是在windows还是linux下我们都可以借助popen执行终端指令并获取到返回值 执行cmd指令并返回结果 string getCmdResult const string strCmd char buf 10240 0 FILE
  • # Flutter中文教程2. Flutter基础-项目结构:lib、test、pubspec.yaml等文件

    系列文章目录 Flutter中文教程1 Flutter简介 什么是Flutter 介绍Flutter的概念 优点与作用 环境配置 工具 SDK与插件安装 Flutter中文教程2 Flutter基础 项目结构 lib test pubspe
  • 动态规划算法的优化技巧

    关键词 动态规划 时间复杂度 优化 状态 摘要 动态规划是信息学竞赛中一种常用的程序设计方法 本文着重讨论了运用动态规划思想解题时时间效率的优化 全文分为四个部分 首先讨论了动态规划时间效率优化的可行性和必要性 接着给出了动态规划时间复杂度
  • java中实现域名解析

    import java net public class Kkkk public static void main String args throws Exception InetAddress address InetAddress g
  • 攻防世界-CTF小白-WEB(新手)

    我会一题一题的做 因为也是新手所以我会尽可能的写的清楚明白 后面所需要的工具我会慢慢发出来 也可以私信我 web新手区 1 view source X老师让小宁同学查看一个网页的源代码 但小宁同学发现鼠标右键好像不管用了 这一题够简单的了
  • 分布式锁问题_演示问题

    通过idea创建两个服务 启动Nginx服务 下载Nginx windows服务 官网nginx download 当然我这里提供了 我们打开nginx的conf目录 然后打开配置文件nginx conf进行配置 upstream test
  • 算法环境配置4_实例分割SOLOv2

    文章目录 一 环境配置 前言 0 我的环境 仅供参考 1 创建虚拟环境 2 激活虚拟环境 3 安装cuda torch torchvision toraudio 4 检查是否安装OK 5 安装预建的 Detectron2 仅限 Linux
  • dpvs入门实践1--概念及编译安装

    DPVS是一种基于DPDK的高性能四层负载均衡器 它来源于Linux Virtual Server LVS及其修改后的alibaba LVS 那LVS是什么呢 Linux Virtual Server是构建在实服务器集群上的高度可伸缩和高可
  • WSL删除文件后,Windows未释放空间

    How to Shrink a WSL2 Virtual Disk 进入powershell diskpart select vdisk file F WSL Ubuntu ext4 vhdx compact vdisk
  • js中的定时器、延时器

    一 定时器 创建定时器 window setInterval 方法名 间隔时间 1000 1秒 var timer window setInterval func1 2000 var i 0 function func1 console l
  • C++函数对象

    目录 函数符概念 函数对象 函数对象 函数指针调用演示 匿名函数Lambda 函数包装器 函数符概念 两大类 函数对象 函数指针 四种形式 函数对象 成员函数指针 全局函数指针 Lambda表达式 函数对象 函数对象概念 1 函数对象是一个
  • 中国电子学会2022年09月份青少年软件编程Python等级考试试卷二级真题(含答案)

    2022 09 Python二级真题 分数 100 题数 37 测试时长 60min 一 单选题 共25题 共50分 1 运行以下代码 结果输出的是 C 2分 means Thank You print len means A 8 B 6
  • 最粗暴的方法实现一个栈

    对于栈和队列是一个很简单的知识 用的感觉也不是很多 但是 我们仍然的学习 加油 在实现最简单的栈之前 我们需要简单了解一下栈是什么 栈 stack 又名堆栈 它是一种运算受限的线性表 限定仅在表尾进行插入和删除操作的线性表 这一端被称为栈顶
  • 数据结构图的操作邻接表创建,深度、广度遍历,Dijkstra最短路径算法

    邻接表 深度优先 广度优先搜索方式遍历图 include
  • 数值计算之 插值法(1)多项式插值——拉格朗日插值法

    数值计算之 插值法 1 多项式插值 拉格朗日插值法 前言 什么是插值 多项式插值法 拉格朗日插值法 总结 前言 移动机器人有一个非常重要的任务 轨迹规划 轨迹规划需要满足运动学原理 即在路径规划给出路点后 必须把路点平滑成光滑的轨迹 才能让

随机推荐

  • 对输入图像按比例压缩、居中填充

    摘要 图像在输入神经网络之前 通常需要进行尺寸压缩 如yolov5的输入为640x640 分类网络Resnet 50的输入为224x224 通常地 分类网络直接将输入进行resize处理 而对于目标检测网络 为了防止目标变形 通常采用pad
  • gitlab在merge request 中可能遇到的问题

    1 merge request 中代码冲突 merge的时候 可能存在代码冲突 这时 开发者可从远程仓库master分支重新拉取最新代码进行本地merge 解决冲突后重新提交代码进行review git pull upstream mast
  • sonar 规则总结

    bug类型 1 equals should not be used to test the values of Atomic classes bug 主要 不要使用equals方法对AtomicXXX进行是否相等的判断 Atomic变量永远
  • echarts 省市区联动地图

    地图效果 省地图
  • Java导出Excel 复杂表头

    文章标题 导出表格 依赖 导出表格 导出表格的方式在我的理解有两种 一种是直接用代码控制表头 简单的表头 一种是直接使用模板直接添加数据就可以 复杂的表头 依赖
  • Centos SSh端口号的更改

    前言 开启某服务或软件的端口 要从该服务或软件监听的端口 多以修改配置文件为主 SeLinux和防火墙 FireWall 的安全策略下手 如果使用阿里云 腾讯等第三方服务器还需要对管理控制台的安全组下手 下面进入主题 如果有什么问题请查看下
  • TCP长连接与NAT超时

    TCP长连接 TCP连接建立后只要不关闭 逻辑上连接一直存在 TCP是有保活定时器的 可以打开保活定时器来维持长连接 设置SO KEEPALIVE才会开启 时间间隔默认7200s 也就是2h 这个默认是关闭的 HTTP中的keep aliv
  • 内向者性格&&安静的力量

    前言 作为搞IT技术的 相信很多人都是比较内向的 以下文章正是介绍内向者的 希望大家能够从中认识自己 接受自己 外向的人更倾向从外部世界寻找力量 而内向的人更倾向关注自己的内部世界 安静 内向性格的竞争力 幸福快乐的首要之点 就在于一个人愿
  • valgrind使用心得

    1 definitely lost 有的时候实际上应该是still reachable 2 uninitialised value s 如 int c GetC if c gt 3 问题不出在c 实际是在GetC里的东西没初始化的 3 换行
  • 冒泡排序及其优化

    冒泡排序及其优化 图解冒泡排序 算法排序步骤 依次比较相邻两个元素 如果第一个比第二个大 则交换两个元素位置 对每一对相邻元素做同样的工作 直到最后一对 这样每次最后一对的元素排序后都是最大的 重复以上步骤直到排序完成 基本算法实现 pub
  • Salesforce解散中国团队,国产SaaS软件如何完美替代

    近日 全球最大的SaaS软件公司Salesforce突然宣布 解散中国区团队 同时关闭位于中国香港的办公室 转由阿里云代销业务 Salesforce的中国淘金之路彻底折戟 国产软件替代外资软件 水土不服等多重因素导致巨头败退 作为全球Saa
  • UKN服务器找不到,ukn6eo.top服务器iP

    2020 10 30 2021 05 02 31 13 76 99 2020 10 30 2021 05 02 31 13 97 245 2020 10 30 2021 05 02 69 63 189 16 2020 11 02 2021
  • 【STM32+ESP-12S连接腾讯云物联网开发平台 1】云平台的创建和AT固件烧录

    腾讯云物联网开发平台创建和ESP 12S的固件烧录 前言 一 腾讯云物联网开发平台的创建 1 创建产品 2 配置产品和创建设备 3 设备三元组说明 二 ESP 12S固件烧录 1 固件获取 2 固件烧录 三 连接测试 1 连接WiFi 2
  • tcp与udp

    tcp 服务端回复完SYN ACK之后 就建立连接 1 为什么是三次 而不是两次 服务端回复完SYN ACK之后 就建立连接 这是为了防止因为已失效的请求报文 突然又传到服务器引起错误 意思就是 假设采用两次握手建立连接 客户端向服务端发送
  • Win10编译64位curl(支持https)

    前期准备 1 安装NASM 官网https www nasm us 安装完成需要设置环境变量PATH 2 安装ActivePerl Download Install Perl ActiveState 3 下载openssl zlib cur
  • 矩阵乘法(C语言)

    Description 矩阵乘法是线性代数中最基本的运算之一 给定三个矩阵 请编写程序判断 是否成立 Input 输入包含多组数据 每组数据的格式如下 第一行包括两个整数p和q 表示矩阵A的大小 后继p行 每行有q个整数 表示矩阵A的元素内
  • 在VMware15.5上安装Ubuntu16.04(18.04)的具体流程及可能出现的问题(保姆级)

    在VMware15 5上安装Ubuntu16 04 18 04 的具体流程及可能出现的问题 保姆级 用镜像安装时已经下载好了两个可用的Ubuntu选项分别是Ubuntu16 04和Ubuntu18 04两个版本 下载时注意与两个版本兼容的R
  • 查看字符对应utf-8编码

    查看字符对应utf 8编码 http www mytju com classcode tools encode utf8 asp
  • 第十二章 微服务核⼼组件之⽹关

    1 什么是微服务的 关和应 场景 什么是 关 API Gateway 是系统的唯 对外的 介于客户端和服务器端之间的中间层 处理 业务功能提供路由请求 鉴权 监控 缓存 限流等功能 统 接 智能路由 AB测试 灰度测试 负载均衡 容灾处理
  • python pymssql_python pymssql — pymssql模块使用指南

    前言 最近在学习python 发现好像没有对pymssql的详细说明 于是乎把官方文档学习一遍 重要部分做个归档 方便自己以后查阅 pymssql是python用来连接Microsoft SQL Server的一个工具库 package 其