广告
返回顶部
首页 > 资讯 > 数据库 >如何用Python操作MySQL
  • 423
分享到

如何用Python操作MySQL

2023-07-06 03:07:35 423人浏览 独家记忆
摘要

这篇文章主要介绍“如何用python操作MySQL”,在日常操作中,相信很多人在如何用Python操作Mysql问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何用Python操作mysql”的疑惑有所帮助!

这篇文章主要介绍“如何用python操作MySQL”,在日常操作中,相信很多人在如何用Python操作Mysql问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何用Python操作mysql”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

一. python操作数据库介绍

Python 标准数据库接口为 Python DB-api,Python DB-API为开发人员提供了数据库应用编程接口。Python 数据库接口支持非常多的数据库,你可以选择适合你项目的数据库:

你可以访问Python数据库接口及API查看详细的支持数据库列表。

不同的数据库你需要下载不同的DB API模块,例如你需要访问Oracle数据库和Mysql数据,你需要下载Oracle和MySQL数据库模块。

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

Python的DB-API,为大多数的数据库实现了接口,使用它连接各数据库后,就可以用相同的方式操作各数据库。

Python DB-API使用流程:

  • 引入 API 模块。

  • 获取与数据库的连接。

  • 执行SQL语句和存储过程。

  • 关闭数据库连接。

二. python操作MySQL模块

Python操作MySQL主要使用两种方式:

DB模块(原生SQL)

  • PyMySQL(支持python2.x/3.x)

  • MySQLdb(目前仅支持python2.x)

ORM框架

  • SQLAchemy

2.1 PyMySQL模块

本文主要介绍PyMySQL模块,MySQLdb使用方式类似

2.1.1 安装PyMySQL

PyMySQL是一个Python编写的MySQL驱动程序,让我们可以用Python语言操作MySQL数据库。

pip install PyMySQL
2.2 基本使用
#! /usr/bin/env python# -*- coding: utf-8 -*-# __author__ = "shuke"# Date: 2018/5/13import pymysql# 创建连接conn = pymysql.connect(host="127.0.0.1", port=3306, user='zff', passwd='zff123', db='zff', charset='utf8mb4')# 创建游标(查询数据返回为元组格式)# cursor = conn.cursor()# 创建游标(查询数据返回为字典格式)cursor = conn.cursor(pymysql.cursors.DictCursor)# 1. 执行SQL,返回受影响的行数effect_row1 = cursor.execute("select * from USER")# 2. 执行SQL,返回受影响的行数,一次插入多行数据effect_row2 = cursor.executemany("insert into USER (NAME) values(%s)", [("jack"), ("boom"), ("lucy")])# 3# 查询所有数据,返回数据为元组格式result = cursor.fetchall()# 增/删/改均需要进行commit提交,进行保存conn.commit()# 关闭游标cursor.close()# 关闭连接conn.close()print(result)"""[{'id': 6, 'name': 'boom'}, {'id': 5, 'name': 'jack'}, {'id': 7, 'name': 'lucy'}, {'id': 4, 'name': 'tome'}, {'id': 3, 'name': 'zff'}, {'id': 1, 'name': 'zhaofengfeng'}, {'id': 2, 'name': 'zhaofengfeng02'}]"""
2.3 获取最新创建的数据自增ID
#! /usr/bin/env python# -*- coding: utf-8 -*-# __author__ = "shuke"# Date: 2018/5/13import pymysql# 创建连接conn = pymysql.connect(host="127.0.0.1", port=3306, user='zff', passwd='zff123', db='zff', charset='utf8mb4')# 创建游标(查询数据返回为元组格式)cursor = conn.cursor()# 获取新创建数据自增IDeffect_row = cursor.executemany("insert into USER (NAME)values(%s)", [("eric")])# 增删改均需要进行commit提交conn.commit()# 关闭游标cursor.close()# 关闭连接conn.close()new_id = cursor.lastrowidprint(new_id)"""8"""
2.4 查询操作
#! /usr/bin/env python# -*- coding: utf-8 -*-# __author__ = "shuke"# Date: 2018/5/13import pymysql# 创建连接conn = pymysql.connect(host="127.0.0.1", port=3306, user='zff', passwd='zff123', db='zff', charset='utf8mb4')# 创建游标cursor = conn.cursor()cursor.execute("select * from USER")# 获取第一行数据row_1 = cursor.fetchone()# 获取前n行数据row_2 = cursor.fetchmany(3)## # 获取所有数据row_3 = cursor.fetchall()# 关闭游标cursor.close()# 关闭连接conn.close()print(row_1)print(row_2)print(row_3)

⚠️ 在fetch数据时按照顺序进行,可以使用cursor.scroll(num,mode)来移动游标位置,如:

  • cursor.scroll(1,mode='relative')  # 相对当前位置移动

  • cursor.scroll(2,mode='absolute')  # 相对绝对位置移动

2.5 防止SQL注入
#! /usr/bin/env python# -*- coding: utf-8 -*-# __author__ = "shuke"# Date: 2018/5/13import pymysql# 创建连接conn = pymysql.connect(host="127.0.0.1", port=3306, user='zff', passwd='zff123', db='zff', charset='utf8mb4')# 创建游标cursor = conn.cursor()# 存在sql注入情况(不要用格式化字符串的方式拼接SQL)sql = "insert into USER (NAME) values('%s')" % ('zhangsan',)effect_row = cursor.execute(sql)# 正确方式一# execute函数接受一个元组/列表作为SQL参数,元素个数只能有1个sql = "insert into USER (NAME) values(%s)"effect_row1 = cursor.execute(sql, ['wang6'])effect_row2 = cursor.execute(sql, ('wang7',))# 正确方式二sql = "insert into USER (NAME) values(%(name)s)"effect_row1 = cursor.execute(sql, {'name': 'wudalang'})# 写入插入多行数据effect_row2 = cursor.executemany("insert into USER (NAME) values(%s)", [('ermazi'), ('dianxiaoer')])# 提交conn.commit()# 关闭游标cursor.close()# 关闭连接conn.close()

这样,SQL操作就更安全了。如果需要更详细的文档参考PyMySQL文档吧。不过好像这些SQL数据库的实现还不太一样,PyMySQL的参数占位符使用%s这样的C格式化符,而Python自带的sqlite3模块的占位符好像是问号(?)。因此在使用其他数据库的时候还是仔细阅读文档吧。

三. 数据库连接池

上文中的方式存在一个问题,单线程情况下可以满足,程序需要频繁的创建释放连接来完成对数据库的操作,那么,我们的程序/脚本在多线程情况下会引发什么问题呢?此时,我们就需要使用数据库连接池来解决这个问题!

3.1 DBUtils模块

DBUtils是Python的一个用于实现数据库连接池的模块。

此连接池有两种连接模式:

  • 为每个线程创建一个连接,线程即使调用了close方法,也不会关闭,只是把连接重新放到连接池,供自己线程再次使用。当线程终止时,连接才会自动关闭

  • 创建一批连接到连接池,供所有线程共享使用(推荐使用)

3.2 模式一
#! /usr/bin/env python# -*- coding: utf-8 -*-# __author__ = "shuke"# Date: 2018/5/13from DBUtils.PersistentDB import PersistentDBimport pymysqlPOOL = PersistentDB( creator=pymysql,# 使用链接数据库的模块 maxusage=None,# 一个链接最多被重复使用的次数,None表示无限制 setsession=[],# 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."] ping=0, # ping MySQL服务端,检查是否服务可用。# 如:0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = always closeable=False, # 如果为False时, conn.close() 实际上被忽略,供下次使用,再线程关闭时,才会自动关闭链接。如果为True时, conn.close()则关闭链接,那么再次调用pool.connection时就会报错,因为已经真的关闭了连接(pool.steady_connection()可以获取一个新的链接) threadlocal=None,# 本线程独享值得对象,用于保存链接对象,如果链接对象被重置 host='127.0.0.1', port=3306, user='zff', passWord='zff123', database='zff', charset='utf8',)def func(): conn = POOL.connection(shareable=False) cursor = conn.cursor() cursor.execute('select * from USER') result = cursor.fetchall() cursor.close() conn.close() return resultresult = func()print(result)
3.2 模式二
#! /usr/bin/env python# -*- coding: utf-8 -*-# __author__ = "shuke"# Date: 2018/5/13import timeimport pymysqlimport threadingfrom DBUtils.PooledDB import PooledDB, SharedDBConnectionPOOL = PooledDB( creator=pymysql,# 使用链接数据库的模块 maxconnections=6,# 连接池允许的最大连接数,0和None表示不限制连接数 mincached=2,# 初始化时,链接池中至少创建的空闲的链接,0表示不创建 maxcached=5,# 链接池中最多闲置的链接,0和None不限制 maxshared=3, # 链接池中最多共享的链接数量,0和None表示全部共享。PS: 无用,因为pymysql和MySQLdb等模块的 threadsafety都为1,所有值无论设置为多少,_maxcached永远为0,所以永远是所有链接都共享。 blocking=True,# 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错 maxusage=None,# 一个链接最多被重复使用的次数,None表示无限制 setsession=[],# 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."] ping=0, # ping MySQL服务端,检查是否服务可用。# 如:0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = always host='127.0.0.1', port=3306, user='zff', password='zff123', database='zff', charset='utf8')def func(): # 检测当前正在运行连接数的是否小于最大链接数,如果不小于则:等待或报raise TooManyConnections异常 # 否则 # 则优先去初始化时创建的链接中获取链接 SteadyDBConnection。 # 然后将SteadyDBConnection对象封装到PooledDedicatedDBConnection中并返回。 # 如果最开始创建的链接没有链接,则去创建一个SteadyDBConnection对象,再封装到PooledDedicatedDBConnection中并返回。 # 一旦关闭链接后,连接就返回到连接池让后续线程继续使用。 conn = POOL.connection() # print('连接被拿走了', conn._con) # print('池子里目前有', POOL._idle_cache, 'rn') cursor = conn.cursor() cursor.execute('select * from USER') result = cursor.fetchall() conn.close() return resultresult = func()print(result)

⚠️ 由于pymysql、MySQLdb等threadsafety值为1,所以该模式连接池中的线程会被所有线程共享,因此是线程安全的。如果没有连接池,使用pymysql来连接数据库时,单线程应用完全没有问题,但如果涉及到多线程应用那么就需要加,一旦加锁那么连接势必就会排队等待,当请求比较多时,性能就会降低了。

3.3 加锁
#! /usr/bin/env python# -*- coding: utf-8 -*-# __author__ = "shuke"# Date: 2018/5/13import pymysqlimport threadingfrom threading import RLockLOCK = RLock()CONN = pymysql.connect(host='127.0.0.1',port=3306,user='zff',password='zff123',database='zff',charset='utf8')def task(arg): with LOCK: cursor = CONN.cursor() cursor.execute('select * from USER ') result = cursor.fetchall() cursor.close() print(result)for i in range(10): t = threading.Thread(target=task, args=(i,)) t.start()
3.4 无锁(报错)
#! /usr/bin/env python# -*- coding: utf-8 -*-# __author__ = "shuke"# Date: 2018/5/13import pymysqlimport threadinGCONN = pymysql.connect(host='127.0.0.1',port=3306,user='zff',password='zff123',database='zff',charset='utf8')def task(arg): cursor = CONN.cursor() cursor.execute('select * from USER ') # cursor.execute('select sleep(10)') result = cursor.fetchall() cursor.close() print(result)for i in range(10): t = threading.Thread(target=task, args=(i,)) t.start()

此时可以在数据库中查看连接情况: show status like 'Threads%';

四. 数据库连接池结合pymsql使用

# cat sql_helper.pyimport pymysqlimport threadingfrom DBUtils.PooledDB import PooledDB, SharedDBConnectionPOOL = PooledDB( creator=pymysql,# 使用链接数据库的模块 maxconnections=20,# 连接池允许的最大连接数,0和None表示不限制连接数 mincached=2,# 初始化时,链接池中至少创建的空闲的链接,0表示不创建 maxcached=5,# 链接池中最多闲置的链接,0和None不限制 #maxshared=3,# 链接池中最多共享的链接数量,0和None表示全部共享。PS: 无用,因为pymysql和MySQLdb等模块的 threadsafety都为1,所有值无论设置为多少,_maxcached永远为0,所以永远是所有链接都共享。 blocking=True,# 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错 maxusage=None,# 一个链接最多被重复使用的次数,None表示无限制 setsession=[],# 开始会话前执行的命令列表。如:["set datestyle to ...", "set time zone ..."] ping=0, # ping MySQL服务端,检查是否服务可用。# 如:0 = None = never, 1 = default = whenever it is requested, 2 = when a cursor is created, 4 = when a query is executed, 7 = always host='192.168.11.38', port=3306, user='root', passwd='apNXgF6RDitFtDQx', db='m2day03Db', charset='utf8')def connect(): # 创建连接 # conn = pymysql.connect(host='192.168.11.38', port=3306, user='root', passwd='apNXgF6RDitFtDQx', db='m2day03db') conn = POOL.connection() # 创建游标 cursor = conn.cursor(pymysql.cursors.DictCursor) return conn,cursordef close(conn,cursor): # 关闭游标 cursor.close() # 关闭连接 conn.close()def fetch_one(sql,args): conn,cursor = connect() # 执行SQL,并返回收影响行数 effect_row = cursor.execute(sql,args) result = cursor.fetchone() close(conn,cursor) return resultdef fetch_all(sql,args): conn, cursor = connect() # 执行SQL,并返回收影响行数 cursor.execute(sql,args) result = cursor.fetchall() close(conn, cursor) return resultdef insert(sql,args): """ 创建数据 :param sql: 含有占位符的SQL :return: """ conn, cursor = connect() # 执行SQL,并返回收影响行数 effect_row = cursor.execute(sql,args) conn.commit() close(conn, cursor)def delete(sql,args): """ 创建数据 :param sql: 含有占位符的SQL :return: """ conn, cursor = connect() # 执行SQL,并返回收影响行数 effect_row = cursor.execute(sql,args) conn.commit() close(conn, cursor) return effect_rowdef update(sql,args): conn, cursor = connect() # 执行SQL,并返回收影响行数 effect_row = cursor.execute(sql, args) conn.commit() close(conn, cursor) return effect_row

PS: 可以利用静态方法封装到一个类中,方便使用

到此,关于“如何用Python操作MySQL”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

您可能感兴趣的文档:

--结束END--

本文标题: 如何用Python操作MySQL

本文链接: https://www.lsjlt.com/news/357574.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何用Python操作MySQL
    这篇文章主要介绍“如何用Python操作MySQL”,在日常操作中,相信很多人在如何用Python操作MySQL问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何用Python操作MySQL”的疑惑有所帮助!...
    99+
    2023-07-06
  • python如何操作mysql
    mysql 使用 启动服务 sudo systemctl start mysql pip3 install pymysql python 操作数据库: 定义类 import pymysql cla...
    99+
    2022-05-13
    python MySQL python 操作MySQL
  • 如何在Python中操作MySQL?
    一. Python 操作数据库介绍Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口。Python 数据库接口支持非常多的数据库,你可以选择适合你项目的数据库:GadFl...
    99+
    2023-05-14
    Python MySQL 数据库
  • python操作mysql
    # rpm -qa |grep MySQL-python 查询是否有mysqldb库MySQL-python-1.2.3-0.3.c1.1.el6.x86_64>>> import MySQLdb #导入mysqldb模块...
    99+
    2023-01-31
    操作 python mysql
  • Python如何操作MySql数据库
    本篇文章为大家展示了Python如何操作MySql数据库,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、关于Python操作数据库的概述Python所有的数据库接口程序都在一定程度上遵守 Pyth...
    99+
    2023-06-15
  • Python 操作Mysql(PyMysql)
    Python 操作 Mysql 常用方式: PyMysql:纯 Python 语言编写的 Mysql 操作客户端,安装方便,支持 Python3。SQLAlchemy:是一个非常强大的 ORM 框架,...
    99+
    2023-09-09
    Python 操作Mysql Python使用PyMysql
  • Python操作MySQL(2)
    查询数据 使用execute()函数执行查询sql语句后,得到的只是受影响的行数,并不能真正拿到我们查询的内容。没关系,这里游标cursor中还提供了三种提取数据的方法:fetchone、fetchmany、fetchall,每个方法都会...
    99+
    2023-01-31
    操作 Python MySQL
  • Python中MySQL数据库如何操作
    今天就跟大家聊聊有关Python中MySQL数据库如何操作,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。  Python标准数据库接口为Python...
    99+
    2022-10-18
  • 如何用Navicat操作MySQL
    前言: 日常使用 MySQL 的过程中,我们可能会经常使用可视化工具来连接 MySQL ,其中比较常用的就是 Navicat 了。平时也会遇到某些同学问, Navicat 怎么安装,如何使用等问题。本篇文章笔者将结合...
    99+
    2022-05-16
    Navicat操作MySQL Navicat MySQL
  • 用python操作mysql数据库(之“删除”操作)
    #!/usr/bin/env python # -*- coding: utf-8 -*-   import MySQLdb  ...
    99+
    2022-10-18
  • 用python操作mysql数据库(之“更新”操作)
    #!/usr/bin/env python # -*- coding: utf-8 -*- import MySQLdb #建立连接 conn...
    99+
    2022-10-18
  • python操作mysql实现安装MySQL-python
    下文我给大家简单讲讲关于python操作mysql实现安装MySQL-python,大家之前了解过相关类似主题内容吗?感兴趣的话就一起来看看这篇文章吧,相信看完python操作mysql实现安装MySQL-...
    99+
    2022-10-18
  • mysql如何操作
    这篇文章将为大家详细讲解有关mysql如何操作,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。    管理 创建表create  &nb...
    99+
    2022-10-19
  • Python操作MySQL(二) ORM
    SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果。 一、安装 pip3 install ...
    99+
    2023-01-31
    操作 Python ORM
  • python关于Mysql操作
    一.安装mysqlwindows下,直接下载mysql安装文件,双击安装文件下一步进行操作即可,下载地址:http://dev.mysql.com/downloads/mysql/Linux下的安装也很简单,除了下载安装包进行安装外,一般的...
    99+
    2023-01-31
    操作 python Mysql
  • python操作oracle和mysql
    1、安装相关包yum install python-devel mysql-devel zlib-devel openssl-devel 2、安装setup、mysql-python包wget h...
    99+
    2022-10-18
  • python怎么操作mysql
    这篇文章将为大家详细讲解有关python怎么操作mysql,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。python操作mysql的方法:首先输入命令行pip insta...
    99+
    2022-10-18
  • python对mysql的操作
     http://sourceforge.net/projects/mysql-python 如果你不确定你的python环境里有没有这个库,那就打开python shell,输入 import MySQLdb,如果返回错误信息,那就表示你的...
    99+
    2023-01-31
    操作 python mysql
  • python操作Mysql实例
    本文介绍了Python操作mysql,执行SQL语句,获取结果集,遍历结果集,取得某个字段,获取表字段名,将图片插入数据库,执行事务等各种代码实例和详细介绍。 实例1、获取MYSQL的版本 #!/usr/bin/env python   i...
    99+
    2023-01-31
    实例 操作 python
  • 【Python】Python操作MySQL详解——PyMySQL
    Python操作MySQL详解——PyMySQL 一,Python操作数据库简介二,Python操作MySQL——PyMySQL(一)PyMySQL模块简介(二)PyMySQL使用(三)SQL...
    99+
    2023-09-23
    python mysql sql
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作