python:数据库连接操作入门

模块

1 import pymssql,pyodbc

 

模块说明

  pymssql和pyodbc模块都是常用的用于SQL Server、MySQL等数据库的连接及操作的模块,当然一些其他的模块也可以进行相应的操作,类似adodbapi、mssql、mxODBC等,我们在实际用的时候选择其中一个模块就好,对于每一个模块都有相应的支持版本和支持平台,大家可以自行查阅文档https://wiki.python.org/moin/SQL%20Server

 

模块安装 

1 pip install pymssql

  关于pip的使用我在我的另一篇博客里提到了https://www.cnblogs.com/jyroy/p/9410593.html

 

模块使用

  我们利用python来进行数据库的操作,那么第一步就应该是连接数据库,这里我们用pymssql模块中的connect方法连连接,在pyodbc模块中同样也是利用connect方法。

  • 使用connect创建连接对象
  • connect.cursor创建游标对象,SQL语句的执行基本都在游标上进行
  • cursor.executeXXX方法执行SQL语句,cursor.fetchXXX获取查询结果等
  • 调用close方法关闭游标cursor和数据库连接

 

  pymssql模块连接

   '''pymssql模块连接SQL Server数据库'''import pymssql   '''格式1'''host= "XXXXXXXXXXXX"  # 数据库服务器名称或IPuser = "test"password = "123"database = "test"conn = pymssql.connect(host, user, password, database)'''格式2'''conn = pymssql.connect(host='XXXXXXXXXXXX', user="test", password="123", database="test")

 

  pyodbc模块连接

    import pyodbcconn = pyodbc.connect(r'DRIVER={SQL Server Native Client 11.0};SERVER=test;DATABASE=test;UID=user;PWD=password')

  不同的SQL server版本对应的DRIVER字段不同。对应关系如下:

  • {SQL Server} - released with SQL Server 2000
  • {SQL Native Client} - released with SQL Server 2005 (also known as version 9.0)
  • {SQL Server Native Client 10.0} - released with SQL Server 2008
  • {SQL Server Native Client 11.0} - released with SQL Server 2012

  使用pyodbc需要安装微软官方的Native Client(没有安装会报错IM002),安装SQL server management studio会自动附带安装(控制面板里可以看到安装的版本)。如果没有安装过需要在https://msdn.microsoft.com/en-us/data/ff658533.aspx下载安装(sqlncli.msi)。建议选择与远程数据库版本相对应的Native Client。如果本地安装的Native Client是高版本,则DRIVER={SQL Server Native Client 11.0}需要填写的是本地的高版本。

 

获取数据库内容

 

  这里涉及到游标的使用(游标大家有不理解的可以参考一下这个大佬的博客https://www.cnblogs.com/selene/p/4480328.html)

1     '''
2     游标的使用
3     '''
4     cursor_1 = conn.cursor()     #获取游标
5 
6     cursor_1.execute("select Sno from student")    #执行语句
7 
8     print (cursor_1.fetchone())              #结果是元组,fetchone()获取查询结果
9  

  

  fetchone() :返回单个的元组,也就是一条记录(row),如果没有结果 则返回 None

  fetchall() :返回多个元组,即返回多个记录(rows),如果没有结果 则返回 ()

 1     '''
 2     fetchall()的使用
 3     '''
 4     cursor_2 = conn.cursor()
 5 
 6     cursor_2.execute("select Sno, Sname from students")
 7 
 8     rows = cursor_2.fetchall()
 9 
10     for row in rows:
11         print(row.Sno, row.Sname)

  

  由于execute返回的是cursor本身,所以如果你需要一次直接获取所有内容可以直接使用cursor本身来获取

1 cursor.execute("select Sno, Sname from students"):
2 
3 for row in cursor:
4     print(row.Sno, row.Sname )

  

  关于游标这里还存在一个要向大家专门说明的地方,

  就是一个连接一次只能有一个游标的查询处于活跃状态,具体什么意思大家可以看下面的代码。

1     cursor_1 = conn.cursor()     #获取游标
2     cursor_1.execute("select Sno from student")    #执行语句
3 
4     cursor_2 = conn.cursor()
5     cursor_2.execute("select * from student where Sno=1")
6 
7     print (cursor_1.fetchall())             #显示的是cursor_2的查询结果
8     print (cursor_2.fetchall())             #不显示任何结果

  提供一个解决的办法

 1      '''解决上述问题'''
 2 
 3     cursor_1.execute("select Sno from student")
 4     cursor_list_1 = cursor_1.fetchall()   #用list把结果存储下来
 5 
 6     cursor_2.execute("select * from student where Sno=1")
 7     cursor_list_2 = cursor_2.fetchall()
 8 
 9     print (cursor_list_1)               #通过print list来获取cursor_1的结果
10     print (cursor_list_2)    

 

   在游标的正常使用中游标获取的查询结果,一行为一个元组。

  我们在实际使用中可以根据需求,用 as_dict 方法返回一个字典变量,其中字典的Key为数据表的列名

 1     '''游标返回行为字典变量'''
 2 
 3     cursor_3 = conn.cursor(as_dict=True)      #创建游标时指定as_dict参数来使游标返回字典变量
 4     cursor_3.execute("select * from student")
 5 
 6     for row in cursor_3:
 7         print('ID=%d' % row['Sno'])    #键名为列表的列名  {Sno:ID}
 8     
 9     print (cursor_3.fetchone())
10     
11     conn.close()     #调用close方法关闭游标cursor和数据库连接

 

  大家如果觉得上面的代码写起来看上去太长,给大家提供一个代码量小的数据库操作解决办法

  就是 with语句,即上下文管理器,它的好处一个是代码的集成度高,一个是省去显示的调用close方法关闭连接和游标

 1     '''
 2     使用with语句(上下文管理器)
 3     '''
 4 
 5     '''通过使用with语句来省去显示的调用close方法关闭连接和游标'''
 6     with pymssql.connect(host='LAPTOP-3OTJHAG9', user="sa", password="123", database="TEST") as conn:    
 7 
 8     #相当于 conn = pymssql.connect(host='XXXXXXXXXXXX', user="test", password="123", database="test")
 9 
10         with conn.cursor(as_dict=True) as cursor_4:
11             cursor_4.execute('select * from student')
12             for row in cursor_4:
13                 print ('ID=%d' %(row['Sno']))

 

  

关于数据库的增删改

 

  增删改数据库的内容也是直接传递SQL语句给execute方法。但要注意运行之后需要用commit提交变更

1 cursor.execute("insert into students(id, name) values ('123', 'My name')")
2 conn.commit()    
3 cursor.execute("delete from studnts where id=‘123’")

4 conn.commit()

 


 

关于pymssql模块,还有不明白的大家可以看下官网http://www.pymssql.org/

 

转载于:https://www.cnblogs.com/jyroy/p/9429897.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353120.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java面试题:集合_Java:选择正确的集合

java面试题:集合这是在您的应用程序中选择Set , List或Map的正确实现的快速指南。 最好的通用或“主要”实现可能是ArrayList,LinkedHashMap和LinkedHashSet。 它们的整体性能更好,除非您需要其他实现提供的特殊功能,否则应使用它…

c:forEach

简介 <c:forEach>为循环控制&#xff0c;它可以将集合(Collection)中的成员循序浏览一遍。运作方式为当条件符合时&#xff0c;就会持续重复执行<c:forEach>的本体内容。 语法 语法1&#xff1a;迭代一集合对象之所有成员 <c:forEach [var"varName"] …

b500k带开关电位器内部构造_R138带开关大功率大电流电位器 B10K B500K

全阻值 :500Ω-1MΩ全阻值公差:20%阻抗特性型式:A,B,C,D杂音:Less than 100mV at 20 mmc.绝缘阻抗:More than 10MΩat DC 250V耐电压:1 minute at AC 250V残留阻值:Term.1~2:Less than 10Ω Term.2~3:Less than 10Ω同步误差(双联):-40dB~0dB3dB额定电压B线性:10mm,15mm:AC 100…

Java 8:将匿名类转换为Lambda表达式

将匿名类&#xff08;实现一种方法&#xff09;重构为lambda表达式&#xff0c;可使您的代码更简洁明了。 例如&#xff0c;这是Runnable及其lambda等效项的匿名类&#xff1a; // using an anonymous class Runnable r new Runnable() {Overridepublic void run() {System.o…

如何去掉a标签的下划线

首先来了解下<a>标签的一些样式&#xff1a; <a>标签的伪类样式 一组专门的预定义的类称为伪类&#xff0c;主要用来处理超链接的状态。超链接文字的状态可以通过伪类选择符&#xff0b;样式规则来控制。伪类选择符包括&#xff1a; 总: a 表示所有状态下的连接 …

Android.os.SystemClock

https://www.linuxidc.com/Linux/2011-11/48325p2.htm 文档中对System.currentTimeMillis()进行了相应的描述&#xff0c;就是说它不适合用在需要时间间隔的地方&#xff0c;如Thread.sleep, Object.wait等&#xff0c;因为可以通过System.setCurrentTimeMillis来改变它的值。要…

批量修改数据_#泰Q头条#065期 四步搞定Excel表中的批量数据修改

『闻道有先后 术业有专攻』又到每周五我们Offcie小课堂时间&#xff0c;每周学一点儿&#xff0c;知识从未如此简单&#xff0c;也真诚的希望各位能在留言板写下你们宝贵的建议&#xff0c;给您带来更具价值的分享。这期跟大家带来的Excel表数据整理功能——统一数值变动的实用…

列表与for循环

列表(list)&#xff1a; python基础数据类型之一&#xff1a;其他语言中也有列表的概念。可索引&#xff0c;可切片&#xff0c;可加长。 列表可以储存大量数据。 #作用&#xff1a;多个装备&#xff0c;多个爱好&#xff0c;多门课程&#xff0c;多个女朋友等#定义&#xff1a…

html用a标签怎么提交表单?

html用a标签怎么提交表单&#xff1f; 2011-03-08 10:55MeACrazy | 分类&#xff1a;Html/Css |浏览10003次如下代码请 帮忙完善 function judgeDelete(){if(confirm("确定要删除吗&#xff1f;")){window.location.href"doDelete.jsp";}}<form action&…

python 读取geotiff_科学网—利用python GDAL库读写geotiff格式的遥感影像方法 - 张伟的博文...

(1)利用python GDAL库读写geotiff格式的遥感影像方法&#xff0c;具有很好的参考价值&#xff0c;不错&#xff01;from osgeo import gdalimport numpy as npdef read_tiff(inpath):dsgdal.Open(inpath)rowds.RasterXSizecolds.RasterYSizebandds.RasterCountgeoTransformds.G…

滑动拼图验证码操作步骤:_拼图项目:延期的后果

滑动拼图验证码操作步骤&#xff1a;Mark Reinhold先生于2012年7月宣布 &#xff0c;他们计划从Java 8撤消Jigsaw项目 &#xff0c;因为Jigsaw计划于2013年9月&#xff08;从现在开始一年&#xff09;推迟其发布。 这个日期是众所周知的&#xff0c;因为Oracle已决定实施Java的…

Vue页面骨架屏(一)

在开发webapp的时候总是会受到首屏加载时间过长的影响&#xff0c;主流的解决方法是在载入完成之前显示loading图效果&#xff0c;而一些大公司会配置一套服务端渲染的架构来解决这个问题。考虑到ssr所要解决的一系列问题&#xff0c;越来越多的APP采用了“骨架屏”的方式去提升…

mysql中数据定义和数据控制语言_MySQL 数据定义语言(DDL)

SQL 包含以下 4部分&#xff1a;1数据定义语言(DDL)&#xff1a;DROP、CREATE、ALTER 等语句。2数据操作语言(DML)&#xff1a;INSERT(插入)、UPDATE(修改)、DELETE(删除)语句。3数据查询语言(DQL)&#xff1a;SELECT 语句。4 数据控制语言(DCL): GRANT、REVOKE、COMMIT、ROLLB…

Page directive: illegal to have multiple occurrences of contentType with different values

org.apache.jasper.JasperException: /commons/meta.jsp(1,1) PWC5988: Page directive: illegal to have multiple occurrences of contentType with different values (old: text/html; charsetutf-8, new: text/html;charsetUTF-8) 问题&#xff1a;contentType 有多个值 解…

我们处理了10亿个Java记录的错误-这是导致97%的错误的原因

97&#xff05;的记录错误是由10个唯一错误引起的 在2016年&#xff0c;一件事已经30年没有改变了。 开发和运营团队仍依靠日志文件对应用程序问题进行故障排除。 由于某些未知原因&#xff0c;我们隐式地信任日志文件&#xff0c;因为我们认为事实隐藏在其中。 如果您足够努力…

洛谷 P1939 【模板】矩阵加速(数列)

题目描述 a[1]a[2]a[3]1 a[x]a[x-3]a[x-1] (x>3) 求a数列的第n项对1000000007&#xff08;10^97&#xff09;取余的值。 输入输出格式 输入格式&#xff1a; 第一行一个整数T&#xff0c;表示询问个数。 以下T行&#xff0c;每行一个正整数n。 输出格式&#xff1a; 每行输出…

Java中Map的使用

Map以按键/数值对的形式存储数据&#xff0c;和数组非常相似&#xff0c;在数组中存在的索引&#xff0c;它们本身也是对象。 Map的接口 Map&#xff0d;&#xff0d;&#xff0d;实现Map Map.Entry&#xff0d;&#xff0d;Map的内部类&#xff0c;描述Map中的按键/数值…

java获取10位随机数_Java基础:JAVA中BitSet使用详解

适用场景&#xff1a;整数&#xff0c;无重复&#xff1b;Bitset 基础Bitset&#xff0c;也就是位图&#xff0c;由于可以用非常紧凑的格式来表示给定范围的连续数据而经常出现在各种算法设计中。上面的图来自c库中bitset的一张图。基本原理是&#xff0c;用1位来表示一个数据是…

使用shiro框架,注销问题的解决

在使用shiro框架的时候&#xff0c;有时候会因为登录问题找不到注销的controller。所以会报404的错误&#xff0c;下面是解决办法&#xff1a; 1.首先写一个类SystemLogoutFilter继承LogoutFilter类&#xff0c;具体代码如下&#xff0c;注意要贴Service标签&#xff1a; impor…

介绍“又一个” Cloud Foundry Gradle插件

在与两个同事&#xff08;感谢Mark Alston &#xff0c; Dave Malone &#xff01;&#xff09;一起使用自动Jenkins管道部署Cloud Foundry应用程序的过程中&#xff0c;我决定尝试编写Gradle插件来执行一些通常需要完成的任务使用命令行Cloud Foundry Client完成 。 介绍带有…