pyodbc 操作SQL Server数据库
wptr33 2025-01-06 15:48 28 浏览
pyodbc是Python包,使用ODBC驱动器来连接SQL Server数据库,pyodbc的基本类型是Connection,Cursor和Row,其中,Connection表示客户端和数据库的连接,并用于提交事务;Cursor表示向数据库发送的查询请求,Row表示获取的结果集。
从微软官方文档来看,更推荐使用pyodbc来操作SQL Server数据库。
一,ODBC驱动程序
要使用pyodbc连接SQL Server数据库,必须安装SQL Server数据库的ODBC 驱动程序:
Install the Microsoft ODBC Driver for SQL Server on Windows,
当前的版本是Microsoft ODBC Driver 17,支持从SQL Server 2008到当前最新的SQL Server 2019版本。
{ODBC Driver 17 for SQL Server}
Microsoft ODBC Driver for SQL Server 是一个动态链接库(DLL),包含run-time支持库,使得程序可以使用native-code API连接到SQL Server数据库。
使用pyodbc连接数据库的基本操作,连接数据库,执行查询,并遍历查询结果:
import pyodbc
# Specifying the ODBC driver, server name, database, etc. directly
cn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER=localhost;DATABASE=testdb;UID=me;PWD=pass')
# Create a cursor from the connection
cursor = cn.cursor()
#Selecting Some Data
cursor.execute("select user_id, user_name from users")
rows = cursor.fetchall()
for row in rows:
print(row.user_id, row.user_name)
cn.close()二,连接对象
连接对象代表Python和数据库的连接,通过connect()函数来创建连接对象,连接对象通过ODBC驱动程序来访问SQL Server数据库:
cn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER=localhost;DATABASE=mine;UID=user;PWD=pwd')1,连接对象的属性
cn.autocommit 是连接对象的一个属性,默认情况下,连接对象是不会自动提交的,该属性的值是False。在执行完成查询请求之后,需要显示提交。
如果设置autocommit为True,那么设置连接为自动提交模式:
cn.autocommit = Truecn.timeout, 用于设置超时时间,单位是秒,默认值是0,表示不限制时间。
2,连接对象可以创建Cursor对象
mycursor = cn.cursor()3,连接对象提交或回滚事务
如果Cursor对象执行的是更新操作,比如执行UPDATE、DELETE或INSERT等更新操作,那么必须通过连接对象来显式提交事务;如果执行的更新操作失败,连接对象必须显式回滚事务。如果Cursor对象执行的SELECT操作,不需要提交事务或者回滚事务。
cn.commit()
cn.rollback()4,关闭连接对象
当关闭连接时,任何未提交的查询语句都会回滚,更新操作的结果将会丢失。当连接对象被删除,特别是超出作用域时,连接会自动关闭,但是,推荐显式关闭连接。
cn.close()三,Cursor对象
Cursor对象用于管理每个fetch操作的上下文,Cursor对象通过Connection对象来创建。
1,执行SQL语句
Cursor调用execute()函数来执行SQL语句:
execute(sql, *parameters)
executemany(sql, *params)execute()函数只执行一次SQL语句,可以向SQL语句传递参数,传参的格式有以下两种:
# standard
cursor.execute("select a from tbl where b=? and c=?", (x, y))
# pyodbc extension
cursor.execute("select a from tbl where b=? and c=?", x, y)executemany()可以对每组参数执行相同的SQL语句,
params = [ ('A', 1), ('B', 2) ]
cursor.executemany("insert into t(name, id) values (?, ?)", params)该语句等价于执行execute()函数两次:
params = [ ('A', 1), ('B', 2) ]
for p in params:
cursor.execute("insert into t(name, id) values (?, ?)", p)如果设置cursor.fast_executemany = True,可以提高executemany()函数的性能,该属性默认是False。
2,fetch结果
从cursor对象中获取单行:
cursor.fetchone()从cursor对象中获取多行:
cursor.fetchone(size=1)从cursor对象中获取所有行:
cursor.fetchall()3,跳到下一个结果集
此方法将使Cursor对象跳至下一个可用结果集,并丢弃当前结果集中的所有剩余行。 如果没有更多结果集,则该方法返回False。 否则,它将返回True,随后对fetch方法的调用将返回下一个结果集中的行。
如果执行返回多个结果的存储过程,那么主要使用此方法。
cursor.nextset()4,关闭连接
在不再需要cursor时,请使用关闭Cursor对象。
cursor.close()如果试图访问已经被关闭的cursor,程序将会出错。Cursor对象会在被删除或者超出作用域时自动关闭。
四,Row对象
Row对象调用fetch函数返回的一行数据,row对象的值可以被替换,从同一个select语句中返回的row对象共享内存。
row对象可以通过索引来访问数据,也可以通过列名来访问数据:
cursor.execute("select album_id, photo_id from photos where user_id=1")
row = cursor.fetchone()
print(row.album_id, row.photo_id)
print(row[0], row[1]) # same as above, but less readablefetchone()函数返回的是单行Row对象,fetchmany()函数 或者fetchall()函数返回的rows对象的列表:
cursor.execute("select album_id, photo_id from photos where user_id=1")
rows = cursor.fetchall()
for row in rows:
row.album_id=1
row.photo_id=1001
五,上下文管理器
Connection对象和Cursor对象都支持Python的上下文管理(Context manager),使用with语句来自动关闭Connection对象和Cursor对象,并调用Connection对象的commit()函数来提交查询。
1,Connection对象的上下文管理器
Connection对象的上下文管理器,不仅自动关闭连接,还会提交查询:
with pyodbc.connect('mydsn') as cnxn:
do_stuff
#等价于
cnxn = pyodbc.connect('mydsn')
do_stuff
if not cnxn.autocommit:
cnxn.commit() 2,Cursor对象的上下文管理器
Cursor对象的上下文管理器,会自动关闭Cursor,还会提交查询:
with cnxn.cursor() as crsr:
do_stuff
#等价于
crsr = cnxn.cursor()
do_stuff
if not cnxn.autocommit:
cnxn.commit() 3,使用上下文管理器来查询结果
import pyodbc
# Specifying the ODBC driver, server name, database, etc. directly
with pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER=localhost;DATABASE=testdb;UID=me;PWD=pass') as cn:
# Create a cursor from the connection
with cn.cursor() as cursor:
#Selecting Some Data
cursor.execute("select user_id, user_name from users")
rows = cursor.fetchall()
for row in rows:
print(row.user_id, row.user_name)4,使用上下文管理器来执行更新操作
在执行更新操作,需要显式提交事务
import pyodbc
with pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER=localhost;DATABASE=testdb;UID=me;PWD=pass') as cn:
try:
cn.autocommit = False
with cn.cursor() as cursor:
params = [ ('A', 1), ('B', 2) ]
cursor.executemany("insert into t(name, id) values (?, ?)", params)
except pyodbc.DatabaseError as err:
cn.rollback()
else:
cn.commit()
finally:
cn.autocommit = True六,调用存储过程
pyodbc 使用{call ...}来调用存储过程,调用存储过程的格式如下:
cursor.execute("{CALL usp_NoParameters}")
params = (14, "Dinsdale")
cursor.execute("{CALL usp_HaveParammeters (?,?)}", params)相关推荐
- oracle数据导入导出_oracle数据导入导出工具
-
关于oracle的数据导入导出,这个功能的使用场景,一般是换服务环境,把原先的oracle数据导入到另外一台oracle数据库,或者导出备份使用。只不过oracle的导入导出命令不好记忆,稍稍有点复杂...
- 继续学习Python中的while true/break语句
-
上次讲到if语句的用法,大家在微信公众号问了小编很多问题,那么小编在这几种解决一下,1.else和elif是子模块,不能单独使用2.一个if语句中可以包括很多个elif语句,但结尾只能有一个...
- python continue和break的区别_python中break语句和continue语句的区别
-
python中循环语句经常会使用continue和break,那么这2者的区别是?continue是跳出本次循环,进行下一次循环;break是跳出整个循环;例如:...
- 简单学Python——关键字6——break和continue
-
Python退出循环,有break语句和continue语句两种实现方式。break语句和continue语句的区别:break语句作用是终止循环。continue语句作用是跳出本轮循环,继续下一次循...
- 2-1,0基础学Python之 break退出循环、 continue继续循环 多重循
-
用for循环或者while循环时,如果要在循环体内直接退出循环,可以使用break语句。比如计算1至100的整数和,我们用while来实现:sum=0x=1whileTrue...
- Python 中 break 和 continue 傻傻分不清
-
大家好啊,我是大田。...
- python中的流程控制语句:continue、break 和 return使用方法
-
Python中,continue、break和return是控制流程的关键语句,用于在循环或函数中提前退出或跳过某些操作。它们的用途和区别如下:1.continue(跳过当前循环的剩余部分,进...
- L017:continue和break - 教程文案
-
continue和break在Python中,continue和break是用于控制循环(如for和while)执行流程的关键字,它们的作用如下:1.continue:跳过当前迭代,...
- 作为前端开发者,你都经历过怎样的面试?
-
已经裸辞1个月了,最近开始投简历找工作,遇到各种各样的面试,今天分享一下。其实在职的时候也做过面试官,面试官时,感觉自己问的问题很难区分候选人的能力,最好的办法就是看看候选人的github上的代码仓库...
- 面试被问 const 是否不可变?这样回答才显功底
-
作为前端开发者,我在学习ES6特性时,总被const的"善变"搞得一头雾水——为什么用const声明的数组还能push元素?为什么基本类型赋值就会报错?直到翻遍MDN文档、对着内存图反...
- 2023金九银十必看前端面试题!2w字精品!
-
导文2023金九银十必看前端面试题!金九银十黄金期来了想要跳槽的小伙伴快来看啊CSS1.请解释CSS的盒模型是什么,并描述其组成部分。...
- 前端面试总结_前端面试题整理
-
记得当时大二的时候,看到实验室的学长学姐忙于各种春招,有些收获了大厂offer,有些还在苦苦面试,其实那时候的心里还蛮忐忑的,不知道自己大三的时候会是什么样的一个水平,所以从19年的寒假放完,大二下学...
- 由浅入深,66条JavaScript面试知识点(七)
-
作者:JakeZhang转发链接:https://juejin.im/post/5ef8377f6fb9a07e693a6061目录...
- 2024前端面试真题之—VUE篇_前端面试题vue2020及答案
-
添加图片注释,不超过140字(可选)...
- 今年最常见的前端面试题,你会做几道?
-
在面试或招聘前端开发人员时,期望、现实和需求之间总是存在着巨大差距。面试其实是一个交流想法的地方,挑战人们的思考方式,并客观地分析给定的问题。可以通过面试了解人们如何做出决策,了解一个人对技术和解决问...
- 一周热门
- 最近发表
-
- oracle数据导入导出_oracle数据导入导出工具
- 继续学习Python中的while true/break语句
- python continue和break的区别_python中break语句和continue语句的区别
- 简单学Python——关键字6——break和continue
- 2-1,0基础学Python之 break退出循环、 continue继续循环 多重循
- Python 中 break 和 continue 傻傻分不清
- python中的流程控制语句:continue、break 和 return使用方法
- L017:continue和break - 教程文案
- 作为前端开发者,你都经历过怎样的面试?
- 面试被问 const 是否不可变?这样回答才显功底
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)
