Python3数据库及连接池操作

淡淡的烟草味﹌ 2022-03-12 19:18 356阅读 0赞

一、PyMySQL 操作 MySQL

PyMySQL是一个纯 Python 实现的 MySQL 客户端操作库,支持事务、存储过程、批量执行等。

PyMySQL 遵循 Python 数据库 API v2.0 规范,并包含了 pure-Python MySQL 客户端库。

安装:

  1. pip3 install PyMySQL

demo:

  1. PyMySQL.py
  2. #!/usr/bin/python3
  3. import pymysql
  4. # 打开数据库连接
  5. db = pymysql.connect("localhost", "root", "haoxin963", "pig")
  6. # 使用 cursor() 方法创建一个游标对象 cursor
  7. cursor = db.cursor()
  8. # 使用 execute() 方法执行 SQL 查询
  9. cursor.execute("SELECT * FROM sys_role")
  10. # 使用 fetchall() 方法获取s所有数据.
  11. data = cursor.fetchall()
  12. print(data)
  13. # 关闭数据库连接
  14. db.close()

二、DBUtils实现数据库连接池

DBUtils是一套Python数据库连接池包,并允许对非线程安全的数据库接口进行线程安全包装。DBUtils来自Webware for Python。

DBUtils提供两种外部接口:

  • PersistentDB :提供线程专用的数据库连接,并自动管理连接。
  • PooledDB :提供线程间可共享的数据库连接,并自动管理连接。

安装:

  1. pip3 install DBUtils

demo:

  1. mysql_DBUtils.py
  2. #!/usr/bin/python3
  3. # -*- coding:utf-8 -*-
  4. import pymysql
  5. import os
  6. import configparser
  7. from pymysql.cursors import DictCursor
  8. from DBUtils.PooledDB import PooledDB
  9. class Config(object):
  10. """
  11. # Config().get_content("user_information")
  12. 配置文件里面的参数
  13. [dbMysql]
  14. host = 192.168.1.180
  15. port = 3306
  16. user = root
  17. password = 123456
  18. """
  19. def __init__(self, config_filename="dbMysqlConfig.cnf"):
  20. file_path = os.path.join(os.path.dirname(__file__), config_filename)
  21. self.cf = configparser.ConfigParser()
  22. self.cf.read(file_path)
  23. def get_sections(self):
  24. return self.cf.sections()
  25. def get_options(self, section):
  26. return self.cf.options(section)
  27. def get_content(self, section):
  28. result = {}
  29. for option in self.get_options(section):
  30. value = self.cf.get(section, option)
  31. result[option] = int(value) if value.isdigit() else value
  32. return result
  33. class BasePymysqlPool(object):
  34. def __init__(self, host, port, user, password, db_name):
  35. self.db_host = host
  36. self.db_port = int(port)
  37. self.user = user
  38. self.password = str(password)
  39. self.db = db_name
  40. self.conn = None
  41. self.cursor = None
  42. class MyPymysqlPool(BasePymysqlPool):
  43. """
  44. MYSQL数据库对象,负责产生数据库连接 , 此类中的连接采用连接池实现
  45. 获取连接对象:conn = Mysql.getConn()
  46. 释放连接对象;conn.close()或del conn
  47. """
  48. # 连接池对象
  49. __pool = None
  50. def __init__(self, conf_name=None):
  51. self.conf = Config().get_content(conf_name)
  52. super(MyPymysqlPool, self).__init__(**self.conf)
  53. # 数据库构造函数,从连接池中取出连接,并生成操作游标
  54. self._conn = self.__getConn()
  55. self._cursor = self._conn.cursor()
  56. def __getConn(self):
  57. """
  58. @summary: 静态方法,从连接池中取出连接
  59. @return MySQLdb.connection
  60. """
  61. if MyPymysqlPool.__pool is None:
  62. __pool = PooledDB(creator=pymysql,
  63. mincached=1,
  64. maxcached=20,
  65. host=self.db_host,
  66. port=self.db_port,
  67. user=self.user,
  68. passwd=self.password,
  69. db=self.db,
  70. use_unicode=True,
  71. charset="utf8",
  72. cursorclass=DictCursor)
  73. print("12211212")
  74. return __pool.connection()
  75. def getAll(self, sql, param=None):
  76. """
  77. @summary: 执行查询,并取出所有结果集
  78. @param sql:查询SQL,如果有查询条件,请只指定条件列表,并将条件值使用参数[param]传递进来
  79. @param param: 可选参数,条件列表值(元组/列表)
  80. @return: result list(字典对象)/boolean 查询到的结果集
  81. """
  82. if param is None:
  83. count = self._cursor.execute(sql)
  84. else:
  85. count = self._cursor.execute(sql, param)
  86. if count > 0:
  87. result = self._cursor.fetchall()
  88. else:
  89. result = False
  90. return result
  91. def getOne(self, sql, param=None):
  92. """
  93. @summary: 执行查询,并取出第一条
  94. @param sql:查询SQL,如果有查询条件,请只指定条件列表,并将条件值使用参数[param]传递进来
  95. @param param: 可选参数,条件列表值(元组/列表)
  96. @return: result list/boolean 查询到的结果集
  97. """
  98. if param is None:
  99. count = self._cursor.execute(sql)
  100. else:
  101. count = self._cursor.execute(sql, param)
  102. if count > 0:
  103. result = self._cursor.fetchone()
  104. else:
  105. result = False
  106. return result
  107. def getMany(self, sql, num, param=None):
  108. """
  109. @summary: 执行查询,并取出num条结果
  110. @param sql:查询SQL,如果有查询条件,请只指定条件列表,并将条件值使用参数[param]传递进来
  111. @param num:取得的结果条数
  112. @param param: 可选参数,条件列表值(元组/列表)
  113. @return: result list/boolean 查询到的结果集
  114. """
  115. if param is None:
  116. count = self._cursor.execute(sql)
  117. else:
  118. count = self._cursor.execute(sql, param)
  119. if count > 0:
  120. result = self._cursor.fetchmany(num)
  121. else:
  122. result = False
  123. return result
  124. def insertMany(self, sql, values):
  125. """
  126. @summary: 向数据表插入多条记录
  127. @param sql:要插入的SQL格式
  128. @param values:要插入的记录数据tuple(tuple)/list[list]
  129. @return: count 受影响的行数
  130. """
  131. count = self._cursor.executemany(sql, values)
  132. return count
  133. def __query(self, sql, param=None):
  134. if param is None:
  135. count = self._cursor.execute(sql)
  136. else:
  137. count = self._cursor.execute(sql, param)
  138. return count
  139. def update(self, sql, param=None):
  140. """
  141. @summary: 更新数据表记录
  142. @param sql: SQL格式及条件,使用(%s,%s)
  143. @param param: 要更新的 值 tuple/list
  144. @return: count 受影响的行数
  145. """
  146. return self.__query(sql, param)
  147. def insert(self, sql, param=None):
  148. """
  149. @summary: 更新数据表记录
  150. @param sql: SQL格式及条件,使用(%s,%s)
  151. @param param: 要更新的 值 tuple/list
  152. @return: count 受影响的行数
  153. """
  154. return self.__query(sql, param)
  155. def delete(self, sql, param=None):
  156. """
  157. @summary: 删除数据表记录
  158. @param sql: SQL格式及条件,使用(%s,%s)
  159. @param param: 要删除的条件 值 tuple/list
  160. @return: count 受影响的行数
  161. """
  162. return self.__query(sql, param)
  163. def begin(self):
  164. """
  165. @summary: 开启事务
  166. """
  167. self._conn.autocommit(0)
  168. def end(self, option='commit'):
  169. """
  170. @summary: 结束事务
  171. """
  172. if option == 'commit':
  173. self._conn.commit()
  174. else:
  175. self._conn.rollback()
  176. def dispose(self, isEnd=1):
  177. """
  178. @summary: 释放连接池资源
  179. """
  180. if isEnd == 1:
  181. self.end('commit')
  182. else:
  183. self.end('rollback')
  184. self._cursor.close()
  185. self._conn.close()
  186. if __name__ == '__main__':
  187. mysql = MyPymysqlPool("dbMysql")
  188. sqlAll = "select * from sys_role;"
  189. result = mysql.getAll(sqlAll)
  190. print(result)
  191. # 释放资源
  192. mysql.dispose()

配置文件:

dbMysqlConfig.cnf

  1. [dbMysql]
  2. host = localhost
  3. port = 3306
  4. user = root
  5. password = haoxin963
  6. db_name = pig

发表评论

表情:
评论列表 (有 0 条评论,356人围观)

还没有评论,来说两句吧...

相关阅读

    相关 java 操作数据库数据库连接

    数据库连接池 什么是数据库连接池 数据库连接池是储存数据库连接资源的容器,当用户需要数据库连接资源时直接可从容器中获取资源,数据库连接资源使用完成后程序将该资源直接