telegram 群组监控 / 群组功能
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

196 lines
6.8 KiB

8 months ago
  1. import threading
  2. import traceback
  3. import pymysql
  4. from pymysql.cursors import DictCursor
  5. from dbutils.pooled_db import PooledDB
  6. class MysqlPoolClient(object):
  7. """
  8. MYSQL数据库对象 , conn = Mysql.getConn()
  9. ;conn.close()del conn
  10. """
  11. # 连接池对象
  12. __pool = {}
  13. __lock = threading.Lock()
  14. # TODO(YaoPeng): 反复加锁影响性能,但是爬虫场景下,可以暂时容忍
  15. def __init__(self, db_conf):
  16. MysqlPoolClient.__lock.acquire()
  17. # 数据库构造函数,从连接池中取出连接,并生成操作游标
  18. # pip install DBUtils
  19. self._conn = MysqlPoolClient.__getConn(db_conf)
  20. self._cursor = self._conn.cursor()
  21. MysqlPoolClient.__lock.release()
  22. def __del__(self):
  23. self.dispose()
  24. @staticmethod
  25. def __getConn(db_conf):
  26. pool_name = db_conf.DB_FULL_NAME
  27. """
  28. @summary:
  29. @return MySQLdb.connection
  30. """
  31. if pool_name not in MysqlPoolClient.__pool:
  32. MysqlPoolClient.__pool[pool_name] = PooledDB(creator=pymysql,
  33. mincached=1,
  34. maxcached=20,
  35. host=db_conf.DBHOST,
  36. port=db_conf.DBPORT,
  37. user=db_conf.DBUSER,
  38. passwd=db_conf.DBPWD,
  39. db=db_conf.DBNAME,
  40. use_unicode=True,
  41. charset=db_conf.DBCHAR,
  42. cursorclass=DictCursor)
  43. return MysqlPoolClient.__pool[pool_name].connection()
  44. def getAll(self, sql, param=None):
  45. """
  46. @summary:
  47. @param sql:使[param]
  48. @param param: /
  49. @return: result list()/boolean
  50. """
  51. if param is None:
  52. count = self._cursor.execute(sql)
  53. else:
  54. count = self._cursor.execute(sql, param)
  55. if count > 0:
  56. query_result = self._cursor.fetchall()
  57. else:
  58. query_result = False
  59. return query_result
  60. def getOne(self, sql, param=None):
  61. """
  62. @summary:
  63. @param sql:使[param]
  64. @param param: /
  65. @return: result list/boolean
  66. """
  67. if param is None:
  68. count = self._cursor.execute(sql)
  69. else:
  70. count = self._cursor.execute(sql, param)
  71. if count > 0:
  72. query_result = self._cursor.fetchone()
  73. else:
  74. query_result = False
  75. return count,query_result
  76. def getMany(self, sql, num, param=None):
  77. """
  78. @summary: num条结果
  79. @param sql:使[param]
  80. @param num:
  81. @param param: /
  82. @return: result list/boolean
  83. """
  84. if param is None:
  85. count = self._cursor.execute(sql)
  86. else:
  87. count = self._cursor.execute(sql, param)
  88. if count > 0:
  89. query_result = self._cursor.fetchmany(num)
  90. else:
  91. query_result = False
  92. return query_result
  93. def insertOne(self, sql, value=None):
  94. """
  95. @summary:
  96. @param sql:
  97. @param value:tuple/list
  98. @return: insertId
  99. """
  100. self._cursor.execute(sql, value)
  101. return self.__getInsertId()
  102. def insertMany(self, sql, values):
  103. """
  104. @summary:
  105. @param sql:
  106. @param values:tuple(tuple)/list[list]
  107. @return: count
  108. """
  109. count = self._cursor.executemany(sql, values)
  110. return count
  111. def updateMany(self, sql, values):
  112. """
  113. @summary:
  114. @param sql:
  115. @param values:tuple(tuple)/list[list]
  116. @return: count
  117. """
  118. count = self._cursor.executemany(sql, values)
  119. return count
  120. def __getInsertId(self):
  121. """
  122. id,
  123. """
  124. self._cursor.execute("SELECT @@IDENTITY AS id")
  125. result = self._cursor.fetchall()
  126. return result[0]['id']
  127. def __query(self, sql, param=None, commit=True):
  128. if param is None:
  129. count = self._cursor.execute(sql)
  130. else:
  131. count = self._cursor.execute(sql, param)
  132. if commit:
  133. self._conn.commit()
  134. return count
  135. def update(self, sql, param=None):
  136. """
  137. @summary:
  138. @param sql: 使(%s,%s)
  139. @param param: tuple/list
  140. @return: count
  141. """
  142. return self.__query(sql, param)
  143. def delete(self, sql, param=None):
  144. """
  145. @summary:
  146. @param sql: 使(%s,%s)
  147. @param param: tuple/list
  148. @return: count
  149. """
  150. return self.__query(sql, param)
  151. def begin(self):
  152. """
  153. @summary:
  154. """
  155. self._conn.autocommit(0)
  156. def end(self, option='commit'):
  157. """
  158. @summary:
  159. """
  160. if option == 'commit':
  161. self._conn.commit()
  162. else:
  163. self._conn.rollback()
  164. def dispose(self, is_end=1):
  165. """
  166. @summary:
  167. """
  168. MysqlPoolClient.__lock.acquire()
  169. if is_end == 1:
  170. self.end('commit')
  171. else:
  172. self.end('rollback')
  173. self._cursor.close()
  174. self._conn.close()
  175. MysqlPoolClient.__lock.release()