【Python】基于pymysql的数据库操作类

本文涉及的产品
RDS Agent(兼容OpenClaw),2核4GB
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
简介: 一 简介      Python和MySQL交互的模块有 MySQLdb 和 PyMySQL(pymysql),MySQLdb是基于C 语言编写的,而且Python3 不在支持MySQLdb 。
一 简介
     Python和MySQL交互的模块有 MySQLdb 和 PyMySQL(pymysql),MySQLdb是基于C 语言编写的,而且Python3 不在支持MySQLdb 。PyMySQL是一个纯Python写的MySQL客户端,它的目标是替代MySQLdb,可以在CPython、PyPy、IronPython和Jython环境下运行,PyMySQL在MIT许可下发布。
    在开发基于Python语言的项目中,为了以后系统能兼容Python3,我们使用了PyMySQL替换了MySQLdb。下面我们来熟悉一下pymysql的使用。
 
二 安装方式
  pymsql的源码 https://github.com/PyMySQL/PyMySQL ,目前还在持续更新。
  1. 安装要求:
  2. Python -- one of the following:
  3.      CPython >= 2.6 or >= 3.3
  4.      PyPy >= 4.0
  5.      IronPython 2.7
  6. MySQL Server -- one of the following:
  7.      MySQL >= 4.1 (tested with only 5.5~)
  8.      MariaDB >= 5.1
  9. 安装
  10.   pip install PyMySQL
  相关文档 , 强烈建议大家仔细阅读一遍。其用法和MySQLdb相差无几,核心用法一致。这样使用pymysql替换mysqldb的成本极小。


三 基于pymysql的数据库交互

  1. #!/usr/bin/env python
  2. # encoding: utf-8
  3. """
  4. author: yangyi@youzan
  5. time: 2015/6/8 上午11:34
  6. func: 基于pymysql的数据库交互类,支持事务提交和回滚,返回结果记录行数,和insert的最新id
  7. """
  8. import pymysql
  9. from warnings import filterwarnings
  10. filterwarnings('ignore', category=pymysql.Warning)
  11. CONNECT_TIMEOUT = 100
  12. IP = 'localhost'
  13. PORT = 3306
  14. USER = 'root'
  15. PASSSWORD = ''

  16. class QueryException(Exception):
  17.     """
  18.     """


  19. class ConnectionException(Exception):
  20.     """
  21.     """

  22. class MySQL_Utils():
  23.     def __init__(
  24.             self, ip=IP, port=PORT, user=USER, password=PASSSWORD,
  25.             connect_timeout=CONNECT_TIMEOUT, remote=False, socket='', dbname='test'):
  26.         self.__conn = None
  27.         self.__cursor = None
  28.         self.lastrowid = None
  29.         self.connect_timeout = connect_timeout
  30.         self.ip = ip
  31.         self.port = port
  32.         self.user = user
  33.         self.password = password
  34.         self.mysocket = socket
  35.         self.remote = remote
  36.         self.db = dbname
  37.         self.rows_affected = 0


  38.     def __init_conn(self):
  39.         try:
  40.             conn = pymysql.connect(
  41.                     host=self.ip,
  42.                     port=int(self.port),
  43.                     user=self.user,
  44.                     db=self.db,
  45.                     connect_timeout=self.connect_timeout,
  46.                     charset='utf8', unix_socket=self.mysocket)
  47.         except pymysql.Error as e:
  48.             raise ConnectionException(e)
  49.         self.__conn = conn


  50.     def __init_cursor(self):
  51.         if self.__conn:
  52.             self.__cursor = self.__conn.cursor(pymysql.cursors.DictCursor)


  53.     def close(self):
  54.         if self.__conn:
  55.             self.__conn.close()
  56.             self.__conn = None

  57.     #专门处理select 语句
  58.     def exec_sql(self, sql, args=None):
  59.         try:
  60.             if self.__conn is None:
  61.                 self.__init_conn()
  62.                 self.__init_cursor()
  63.             self.__conn.autocommit = True
  64.             self.__cursor.execute(sql, args)
  65.             self.rows_affected = self.__cursor.rowcount
  66.             results = self.__cursor.fetchall()
  67.             return results
  68.         except pymysql.Error as e:
  69.             raise pymysql.Error(e)
  70.         finally:
  71.             if self.__conn:
  72.                 self.close()

  73.     # 专门处理dml语句 delete,updete,insert 
  74.     def exec_txsql(self, sql, args=None):
  75.         try:
  76.             if self.__conn is None:
  77.                 self.__init_conn()
  78.                 self.__init_cursor()
  79.             if self.__cursor is None:
  80.                 self.__init_cursor()


  81.             self.rows_affected=self.__cursor.execute(sql, args)
  82.             self.lastrowid = self.__cursor.lastrowid
  83.             return self.rows_affected
  84.         except pymysql.Error as e:
  85.             raise pymysql.Error(e)
  86.         finally:
  87.             if self.__cursor:
  88.                 self.__cursor.close()
  89.                 self.__cursor = None

  90.     # 提交
  91.     def commit(self):
  92.         try:
  93.             if self.__conn:
  94.                 self.__conn.commit()
  95.         except pymysql.Error as e:
  96.             raise pymysql.Error(e)
  97.         finally:
  98.             if self.__conn:
  99.                 self.close()

  100.     #回滚操作
  101.     def rollback(self):
  102.         try:
  103.             if self.__conn:
  104.                 self.__conn.rollback()
  105.         except pymysql.Error as e:
  106.             raise pymysql.Error(e)
  107.         finally:
  108.             if self.__conn:
  109.                 self.close()
  110.     # 适用于需要获取插入记录的主键自增id
  111.     def get_lastrowid(self):
  112.         return self.lastrowid
     #获取dml操作影响的行数
    def get_affectrows(self):
        return self.rows_affected
     #MySQL_Utils初始化的实例销毁之后,自动提交
     def __del__(self):
        self.commit()
四 小结
   前几天刚刚将我们的系统中的MySQLdb 替换为PyMySQL, 还未遇到问题。欢迎大家使用测试上述脚本,有问题欢迎和我讨论。 如果本文对您有帮助 ,可以赞助 一瓶饮料。




相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
7月前
|
SQL 关系型数据库 数据库
Python SQLAlchemy模块:从入门到实战的数据库操作指南
免费提供Python+PyCharm编程环境,结合SQLAlchemy ORM框架详解数据库开发。涵盖连接配置、模型定义、CRUD操作、事务控制及Alembic迁移工具,以电商订单系统为例,深入讲解高并发场景下的性能优化与最佳实践,助你高效构建数据驱动应用。
885 7
|
8月前
|
数据采集 关系型数据库 MySQL
python爬取数据存入数据库
Python爬虫结合Scrapy与SQLAlchemy,实现高效数据采集并存入MySQL/PostgreSQL/SQLite。通过ORM映射、连接池优化与批量提交,支持百万级数据高速写入,具备良好的可扩展性与稳定性。
|
SQL 数据库 开发者
Python中使用Flask-SQLAlchemy对数据库的增删改查简明示例
这样我们就对Flask-SQLAlchemy进行了一次简明扼要的旅程,阐述了如何定义模型,如何创建表,以及如何进行基本的数据库操作。希望你在阅读后能对Flask-SQLAlchemy有更深入的理解,这将为你在Python世界中从事数据库相关工作提供极大的便利。
945 77
|
8月前
|
缓存 供应链 芯片
电子元件类商品 item_get - 商品详情接口深度分析及 Python 实现
电子元件商品接口需精准返回型号参数、规格属性、认证及库存等专业数据,支持供应链管理与采购决策。本文详解其接口特性、数据结构与Python实现方案。
|
8月前
|
存储 数据库 开发者
Python SQLite模块:轻量级数据库的实战指南
本文深入讲解Python内置sqlite3模块的实战应用,涵盖数据库连接、CRUD操作、事务管理、性能优化及高级特性,结合完整案例,助你快速掌握SQLite在小型项目中的高效使用,是Python开发者必备的轻量级数据库指南。
710 0
|
测试技术 Python
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
797 31
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
|
人工智能 Python
[oeasy]python083_类_对象_成员方法_method_函数_function_isinstance
本文介绍了Python中类、对象、成员方法及函数的概念。通过超市商品分类的例子,形象地解释了“类型”的概念,如整型(int)和字符串(str)是两种不同的数据类型。整型对象支持数字求和,字符串对象支持拼接。使用`isinstance`函数可以判断对象是否属于特定类型,例如判断变量是否为整型。此外,还探讨了面向对象编程(OOP)与面向过程编程的区别,并简要介绍了`type`和`help`函数的用法。最后总结指出,不同类型的对象有不同的运算和方法,如字符串有`find`和`index`方法,而整型没有。更多内容可参考文末提供的蓝桥、GitHub和Gitee链接。
348 11
|
数据库 Python
【YashanDB知识库】python驱动查询gbk字符集崖山数据库CLOB字段,数据被驱动截断
【YashanDB知识库】python驱动查询gbk字符集崖山数据库CLOB字段,数据被驱动截断
|
关系型数据库 MySQL 数据库连接
python脚本:连接数据库,检查直播流是否可用
【10月更文挑战第13天】本脚本使用 `mysql-connector-python` 连接MySQL数据库,检查 `live_streams` 表中每个直播流URL的可用性。通过 `requests` 库发送HTTP请求,输出每个URL的检查结果。需安装 `mysql-connector-python` 和 `requests` 库,并配置数据库连接参数。
391 68
|
存储 C语言 Python
[oeasy]python077_int类型怎么用_整数运算_integer_进制转化_int类
本文主要讲解了Python中`int`类型的应用与特性。首先回顾了`int`词根的溯源,探讨了整型变量的概念及命名规则(如匈牙利命名法)。接着分析了整型变量在内存中的存储位置和地址,并通过`type()`和`id()`函数验证其类型和地址。还介绍了整型变量的运算功能,以及如何通过`int()`函数将字符串转化为整数,支持不同进制间的转换(如二进制转十进制)。此外,文章提及了关键字`del`的使用场景,对比了Python与C语言中`int`的区别,并总结了整型与字符串类型的差异,为后续深入学习奠定基础。
348 1

推荐镜像

更多