python -MySQLdb的安装与使用

article/2025/9/25 23:44:14

         MySQLdb是一款较为底层的,python连接mysql用的模块。和更加高级的,提供ORM的模块不同,MySQLdb主要还是聚焦于如何和数据库进行连接和进行基本的操作,操作的体现形式主要还是进行SQL语句的执行。

在Linux下

pip install MySQL-python

  如果安装之后仍不能正常运行,尝试用yum install MySQL-python,因为这个模块需要一些第三方程序来运行的。

  如果是在windows环境下安装的话那么可以直接下载一个安装程序来安装已经编译好的模块。比如去【http://www.codegood.com/downloads】下载。

MySQLdb提供了connect方法来建立一个与数据库的连接,调用这个对象的close方法来关闭一个连接。通过这个连接可以创建出一个游标对象,通过游标对象来进行数据的增删查改。

import MySQLdb

db = MySQLdb.connect(host='localhost',user='weiyz',passwd='123456',db='test_DB',charset='utf-8')

cursor = db.cursor()    #创建一个游标对象
cursor.exeute("use test_table;show tables;")    #执行SQL语句,注意这里不返回结果,只是执行而已

res = cursor.fetchall()    #fetchall方法返回所有匹配的元组,给出一个大元组(每个元素还是一个元组)

####或者也可以这样####
res = cursor.fetchone()
while res:
  print res
  res = cursor.fetchone()    #fetchone只给出一条数据,然后游标后移。游标移动过最后一行数据后再fetch就得到None

db.close()

另外关于db这个连接对象,除了可以实例化一个游标对象之外,还可以进行commit(),rollback()等操作。

■  游标对象的执行和返回数据

  就像上面例子中提到的那样,cursor可以调用execute来执行一定的SQL语句,也可以fetchone或者fetchall来得到返回的数据。接下来详细看一下cursor的各个方法:

  callproc(procname[,args])  调用一个叫做procname的存储过程

  close()  游标也有关闭方法,游标被关闭之后就不能再移动,更不能被fetch

  execute(query[,args])  query是一个SQL串,args是一个序列或者映射,将依次为query中的变量赋值。关于query串中的变量设置下面会细讲。这个方法返回的值是影响的行数(比如查询SQL就返回查询到了多少行,增删SQL就返回增删了多少行)

  executemany(query[,args])  这个方法和execute是类似的,只不过它是重复好几次执行execute,args也是一个“相同长度序列的序列”,每一次执行都把一个序列中的项对应到query的变量中去。据说executemany在效率上比execute高出很多, 在批量插入、批量更新时可以考虑使用。需要注意的是,这个方法是一个整体,如果想要进行多次查询操作用这个方法的话往往只能得到最后一个参数约束到SQL中得到的结果集。

  fetchone/fetchall()  获得一行/所有行结果

  fetchmany([size])  size指出了我到底要获取多少行的数据,如果能够返回的行数小于要求的行数的话,就以少的为准。

  nextset()  放弃所有结果集中结果直接跳到下个结果集(如果有的话)。如果没有更多结果集就返回None,否则返回True,接下来的fetch操作将会从新结果集返回数据了。所谓结果集,就是比如连着执行两条SQL语句的话,如果不调用nextset,那么fetch来fetch去总是只能得到第一个语句的结果内容,调用了这个之后就可以看到下一个语句执行结果的内容了。

  rowcount  这个属性代表了上一次execute*方法得到结果的结果行数,如果是-1则代表了上一次返回结果没有结果集且行数无法确定。

 

  ●  query字符串中的变量设置

  query中可以设置变量来动态地生成一些SQL语句,从而使得操作更加灵活多变。query中的变量大多数时候用在查询操作里面,因为没有统一的格式规定,设定变量的方法有很多种形式。比如可以用?,格式化字符串,数字等等。下面统一用格式化字符串的形式来表示。

  比如"select Sno,Sname from Student where Sno=%s"

  “select * from Client where level > %d and gid = %s"

  这些变量可以和execute*方法的args参数进行配合以具体化。对于execute方法而言,因为只执行一次SQL,所有它的args只需要一个元组(序列),元组各元素和SQL串中的变量一一对应。而对于executemany方法,args是一系列上面那样的元组组成的一个元组(序列),相当于以一个循环依次把大元组中的各个小元组约束进SQL执行。实例:

复制代码

SQL = """
select * from Client where level > %d and gid = %s
"""
cursor.execute(SQL,(2,'10001'))    #需要注意的是,如果只有一个变量,args不要写类似('10001')这样,因为这判是<type 'str'>而不是tuple,应该写('10001',)print cursor.fetchone()##如果同样的SQL,用executemany来查询多个结果集的话
cursor.executemany(SQL,(\(2,'10001'),\(2,'10002'),\(1,'10003'),\)\
)
#如此就相当于依次把2,10001;2,10002和1,10003约束给SQL在执行,但是从查询数据的角度来看,只能得到10003的数据,
#因为executemany是一口气执行完的,fetch只能fetch到最后一个数字。所以executemany比较适合用于写而不是读操作。

复制代码

 

■  事务操作

  因为MySQLdb是比较底层的模块,对数据库的操作都基于最基本的SQL语句,所以也就无所谓细讲如何增删查改了(反正到头来都是调用SQL),不过对于事务,还是有必要提及。

  事务是通过接口对于数据库做出操作的最基本操作单位,可以看成是一系列操作的集合。一个事务具有以下特性:

  原子性,事务中的所有操作要么都做要么都不做。

  一致性,事务可以把数据库从一个一致性状态转变成另一个一致性状态

  永久性,事务对数据库做出的改变是永久的。

  隔离性,事务不应该被其他并行运行的事务所影响,事务间彼此应该是独立的

 

  基于以上对于事务的理解,可以如此利用事务的commit和rollback方法:

复制代码

SQL = "DELETE FROM Client WHERE level < %d"db = MySQLdb.connect(xxxxx)
cursor = db.cursor()
try:cursor.execute(SQL,(2,))db.commit()
except Exception,e:db.rollback()
finally:cursor.close()db.close()

复制代码

  对于支持事务的数据库, 在Python数据库编程中,当游标建立之时,就自动开始了一个隐形的数据库事务。commit()方法游标的所有更新操作,rollback()方法回滚当前游标的所有操作。

 

■  积累

  ●  关于使用MySQLdb获取到的数据的类型不符合预期的问题

  今天碰到了一个问题。从数据库中通过MySQLdb获取到了一些数据是诸如这样的((u'01',8L,Decimal(900.00)),)。可以看到MySQLdb取数据的时候对于相应的MySQL中的数据类型会被转换成类似的Python中的类型。但是有时候我们不想要那么repr地表示,比如这一行数据我就只想让它是'01',8,900.0这些比较基本的Python中的类型而不是unicode,long,float这些。

  一种办法是在取得数据之后进行一些数据的清洗。找到的另一种办法是将建立连接时的convertor改变。

  MySQLdb在建立和MySQL之间的连接的时候,会声明好数据库数据类型和Python数据类型的对应关系。这部分信息被维护在了MySQLdb.convertors.conversions这个字典里。重点关注这个字典的中间部分有一些类似于FIELD_TYPE.XXX: xxx的键值对。键值其实是一个常量,后者是Python中的一个类型。这个字典就是会在MySQLdb.connect方法被执行时作为一个参数传递进来,并凭借里面的信息来对应类型的。

  所以如果我们想把默认从数据库中取出来的Decimal换成float,8L换成int的8,就可以这么高:

复制代码

from MySQLdb import convertorsconv = convertors.conversions.copy()
conv[246] = float    # 246对应FIELD_TYPE.NEWDECIMAL,在convertors.py的代码中,如果from decimal import Decimal没有出错那么这个类型的数据最终返回Decimal,现在改成了float
conv[3] = int
conv[4] = int
# 3和4分别对应Long和LongLong数据,都改成int了conn = MySQLdb.connect(host='xxxx',user='xxx',passwd='xxx',db='xxx',charset='xxx',conv=conv)
# 将参数conv设置为我们修改过的字典,之后再进行常规操作即可

复制代码

 


http://chatgpt.dhexx.cn/article/We4SGIv9.shtml

相关文章

数据库--mysql

数据库 《高性能Mysql(第三版)》 数据库三大范式、反模式 强调属性的原子性约束&#xff0c;要求属性具有原子性&#xff0c;不可再分解强调记录的唯一性约束&#xff0c;表必须有一个主键&#xff0c;并且没有包含在主键中的列必须完全依赖于主键&#xff0c;而不能只依赖于主…

Python 如何安装 MySQLdb ?

人生苦短 我用python Python 标准数据库接口为 Python DB-API&#xff0c; Python DB-API为开发人员提供了数据库应用编程接口。 Python 数据库接口支持非常多的数据库&#xff0c; 你可以选择适合你项目的数据库&#xff1a; GadFlymSQLMySQLPostgreSQLMicrosoft SQL Serve…

MySQL——数据库

1.什么是数据库&#xff1a; 数据库&#xff08;database&#xff09;&#xff1a;存储数据的“仓库”。它保存了一系列有组织的数据。 2.DSMS数据库管理系统&#xff1a; 数据库管理系统&#xff1a;数据库是通过DBMS创建和操作的容器。 数据库管理系统&#xff08;DBMS&a…

数据库----MySQL

文章目录 常识常见数据库数据库结构SQL语句分类 事务事务的4个特性 ACID隔离级别事务处理**提交** **commit****回滚** **rollback** 常用操作库的常用操作建库删库查库使用库 表的常用操作创建表修改表删除表查看所有表查看表结构/设计表 表记录的常用操作插入记录查询记录修改…

数据库—mysql

提示&#xff1a;以下是本篇文章正文内容 一、InnoDB InnoDB 内部做了很多优化&#xff0c;包括从磁盘读取数据时采用的可预测性读&#xff0c;能够自动在内存中创建 hash 索引以加速读操作的自适应哈希索引&#xff0c;以及能够加速插入操作的插入缓冲区等。 InnoDB 支持真正…

MySQLdb安装与使用

一、MAC系统 1. 安装(使用pip命令) 【1】使用 easy_install pip命令安装pip 【2】安装成功&#xff0c;输入pip显示用法、命令行等信息&#xff1b;命令 which pip 可以查看安装位置 【3】要通过python连接mysql数据库&#xff0c;需要安装MySQLdb模块&#xff0c;该模块其实…

MYSQL 数据库

MySql数据库特点 1、开源数据库&#xff0c;不需要支付额外费用&#xff0c;项目上云首选&#xff1b; 2、关系型数据库&#xff0c;支持多条件场景查询&#xff1b; 3、支持多种存储引擎&#xff1b; MySql数据库语句执行步骤 1&#xff09;创建连接&#xff0c;验证用户…

【Python】MySQLdb库的使用以及格式化输出字段中的值

一.项目简单介绍 我们获取字段的内容方式有很多种,但基本都要ctrlc(复制)ctrlv粘贴,然后还有手动去更改 而以python作为处理工具将会快很多,本项目需要安装的库:MySQLdb,pandas,numpy 比如我们想要在每个不同的值加上"" 而复制的数据为下图 那么我们每次都要在每行…

图片信息用浏览器显示:data:image/png;base64,+图片内容

最近看到若依图片验证码获取方式时&#xff0c;后台返回的是一串验证码字符串&#xff1a; 例如 /9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyM…

图片中隐藏信息——图片隐写术

https://www.jianshu.com/p/72f0d0953ca4 主要原理&#xff1a; 图片是由一个个像素组成的。每个像素由一组&#xff08;r,g,b&#xff09;值表示&#xff08;png格式图片&#xff0c;多一个alpha透明度值&#xff09;。而对于单个r&#xff0c;g或b&#xff0c;其范围在0~25…

android 获取图片信息 之 ExifInterface

Android--操作图片Exif信息 --------------------------------------------------------------------------------------- 作者&#xff1a;承香墨影 出处&#xff1a;http://plokmju.cnblogs.com/ 更多内容&#xff0c;请阅读本人新书&#xff1a;《Android深入浅出》 欢迎…

图片头文件信息解析

今天发现获取图片的宽高&#xff0c;并不需要把图片完全读完之后再来获取&#xff0c;而只需要读取文件头文件&#xff0c;几十个字节便可以读出文件的宽高。 图片的文件头部存储有该图片相关信息&#xff0c;可以从中读取相应字段&#xff0c;得到尺寸、大小、格式等信息。由于…

图片Exif信息解析(Java实现)

前言 可交换图像文件(Exchangeable Image File&#xff0c;Exif)信息图像在拍摄时保留的相关参数&#xff1a;比如图像信息&#xff08;厂商&#xff0c;分辨率等&#xff09;&#xff0c;相机拍摄记录&#xff08;ISO&#xff0c;白平衡&#xff0c;饱和度&#xff0c;锐度等…

java项目实战:处理图片水印,提取图片信息,生成excel表

在这次应用软件设计课程中&#xff0c;要求从今年的软件杯大赛上的项目选择一个实现。我选的是"网店工商信息提取"&#xff0c;具体要求就是&#xff1a;从给出的带水印的图片中提取出企业名称和企业注册号&#xff0c;并根据这些信息生成excel表格。 刚刚开始以为这…

nodejs图片读取

response返回都是html/text&#xff0c;向前台输出一张图片用的image/jpeg,服务器读取图片的时候是按照binary的二进制方式读取&#xff0c;给客户端返回的时候也按照binary二进制的方式返回。 从服务器读取一张图片给客户端输出&#xff1a; 效果&#xff1a;输入localhost:…

[软件工具] 如何批量获取图片信息,尺寸、大小、路径、文件名,然后导出表格或者txt的文本,下面教你使用方法

前几天遇到一个比较棘手的需求&#xff1a; 如何获取几万张图片的大量的图片信息&#xff0c;如尺寸、大小、路径、文件名等等&#xff0c; 去看了百度 好多都是教写批处理的文件信息&#xff0c;对批处理不是很懂&#xff0c;写了几次都没成功 然后做这么一款软件&#xff…

APICloud框架——获取本地图片信息

api.getPicture 获取本地图片放置到服务器上或者在app中预览是app的基本功能&#xff0c;今天使用了APICloud框架的api.getPicture这个api获取到的本地图片预览在app中&#xff0c;就像上传qq头像一样&#xff0c;其实就是这个需求&#xff0c;获取本地照片&#xff08;拍摄照片…

imagemagick 获取图片信息,放大缩小,指定区域,旋转,边框,draw png压缩问题

Table of Contents 1.获取图片信息 2.放大缩小 -resize 3.放大缩小 -sample 4.指定区域 5.旋转 6.添加边框 7.draw的用法 1.获取图片信息 C:\Users\Administrator>magick identify F:\imagemagick\1.jpg F:\imagemagick\1.jpg JPEG 1440x2560 1440x256000 8-bit sRGB …

解决透视变换后图片信息丢失的问题

问题背景&#xff1a;最近在做图像拼接&#xff0c;思路是首先对输入的两幅图进行特征提取&#xff0c;提取的方法使用的是经典的SIFT&#xff08;Scale-invariant feature transform&#xff09;算法&#xff1b;然后进行特征匹配&#xff0c;匹配的思路是将一幅图中的特征点以…

wx.getImageInfo(Object object)获取图片信息

微信小程序第一周总结 总结人&#xff1a;陈曦 wx.getImageInfo(Object object)获取图片信息 在小程序/小游戏中使用网络相关的 API 时&#xff0c;每个微信小程序需要事先设置一个通讯域名&#xff0c;小程序只可以跟指定的域名与进行网络通信。包括普通 HTTPS 请求&#xff…