db.py 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. # -*- coding: utf-8 -*-
  2. # @Author: wangkun
  3. # @Time: 2023/2/2
  4. """
  5. 数据库连接及操作
  6. """
  7. import redis
  8. import pymysql
  9. from common.common import Common
  10. # from common import Common
  11. class MysqlHelper:
  12. @classmethod
  13. def connect_mysql(cls, env, machine):
  14. if machine == "aliyun_hk":
  15. # 创建一个 Connection 对象,代表了一个数据库连接
  16. connection = pymysql.connect(
  17. host="rm-j6cz4c6pt96000xi3.mysql.rds.aliyuncs.com", # 数据库IP地址,内网地址
  18. # host="rm-j6cz4c6pt96000xi3lo.mysql.rds.aliyuncs.com",# 数据库IP地址,外网地址
  19. port=3306, # 端口号
  20. user="crawler", # mysql用户名
  21. passwd="crawler123456@", # mysql用户登录密码
  22. db="piaoquan-crawler", # 数据库名
  23. # 如果数据库里面的文本是utf8编码的,charset指定是utf8
  24. charset="utf8",
  25. )
  26. elif env == "prod":
  27. # 创建一个 Connection 对象,代表了一个数据库连接
  28. connection = pymysql.connect(
  29. host="rm-bp1159bu17li9hi94.mysql.rds.aliyuncs.com", # 数据库IP地址,内网地址
  30. # host="rm-bp1159bu17li9hi94ro.mysql.rds.aliyuncs.com",# 数据库IP地址,外网地址
  31. port=3306, # 端口号
  32. user="crawler", # mysql用户名
  33. passwd="crawler123456@", # mysql用户登录密码
  34. db="piaoquan-crawler", # 数据库名
  35. # 如果数据库里面的文本是utf8编码的,charset指定是utf8
  36. charset="utf8",
  37. )
  38. else:
  39. # 创建一个 Connection 对象,代表了一个数据库连接
  40. connection = pymysql.connect(
  41. host="rm-bp1k5853td1r25g3n690.mysql.rds.aliyuncs.com", # 数据库IP地址,内网地址
  42. # host="rm-bp1k5853td1r25g3ndo.mysql.rds.aliyuncs.com", # 数据库IP地址,外网地址
  43. port=3306, # 端口号
  44. user="crawler", # mysql用户名
  45. passwd="crawler123456@", # mysql用户登录密码
  46. db="piaoquan-crawler", # 数据库名
  47. # 如果数据库里面的文本是utf8编码的,charset指定是utf8
  48. charset="utf8",
  49. )
  50. return connection
  51. @classmethod
  52. def get_values(cls, log_type, crawler, sql, env, machine):
  53. try:
  54. # 连接数据库
  55. connect = cls.connect_mysql(env, machine)
  56. # 返回一个 Cursor对象
  57. mysql = connect.cursor()
  58. # 执行 sql 语句
  59. mysql.execute(sql)
  60. # fetchall方法返回的是一个元组,里面每个元素也是元组,代表一行记录
  61. data = mysql.fetchall()
  62. # 关闭数据库连接
  63. connect.close()
  64. # 返回查询结果,元组
  65. return data
  66. except Exception as e:
  67. Common.logger(log_type, crawler).error(f"get_values异常:{e}\n")
  68. @classmethod
  69. def update_values(cls, log_type, crawler, sql, env, machine):
  70. # 连接数据库
  71. connect = cls.connect_mysql(env, machine)
  72. # 返回一个 Cursor对象
  73. mysql = connect.cursor()
  74. try:
  75. # 执行 sql 语句
  76. res = mysql.execute(sql)
  77. # 注意 一定要commit,否则添加数据不生效
  78. connect.commit()
  79. return res
  80. except Exception as e:
  81. Common.logger(log_type, crawler).error(f"update_values异常,进行回滚操作:{e}\n")
  82. # 发生错误时回滚
  83. connect.rollback()
  84. # 关闭数据库连接
  85. connect.close()
  86. class RedisHelper:
  87. @classmethod
  88. def connect_redis(cls, env, machine):
  89. if machine == "aliyun_hk":
  90. redis_pool = redis.ConnectionPool(
  91. # host='r-bp154bpw97gptefiqk.redis.rds.aliyuncs.com', # 内网地址
  92. host="r-bp154bpw97gptefiqkpd.redis.rds.aliyuncs.com", # 外网地址
  93. port=6379,
  94. db=2,
  95. password="Qingqu2019",
  96. )
  97. redis_conn = redis.Redis(connection_pool=redis_pool)
  98. elif env == "prod":
  99. redis_pool = redis.ConnectionPool(
  100. host="r-bp1mb0v08fqi4hjffu.redis.rds.aliyuncs.com", # 内网地址
  101. # host='r-bp1mb0v08fqi4hjffupd.redis.rds.aliyuncs.com', # 外网地址
  102. port=6379,
  103. db=2,
  104. password="Qingqu2019",
  105. )
  106. redis_conn = redis.Redis(connection_pool=redis_pool)
  107. else:
  108. redis_pool = redis.ConnectionPool(
  109. # host='r-bp154bpw97gptefiqk.redis.rds.aliyuncs.com', # 内网地址
  110. host="r-bp154bpw97gptefiqkpd.redis.rds.aliyuncs.com", # 外网地址
  111. port=6379,
  112. db=2,
  113. password="Qingqu2019",
  114. )
  115. redis_conn = redis.Redis(connection_pool=redis_pool)
  116. return redis_conn
  117. @classmethod
  118. def redis_push(cls, env, machine, data):
  119. redis_conn = cls.connect_redis(env, machine)
  120. # print("开始写入数据")
  121. redis_conn.lpush(machine, data)
  122. # print("数据写入完成")
  123. @classmethod
  124. def redis_pop(cls, env, machine):
  125. redis_conn = cls.connect_redis(env, machine)
  126. if redis_conn.llen(machine) == 0:
  127. return None
  128. else:
  129. return redis_conn.rpop(machine)
  130. class RedisClient(object):
  131. """
  132. Redis client by python
  133. Todo 如果 Redis 服务挂了,怎么做能够不影响业务
  134. 思路, 每次使用 redis 接口前先判断是否连接成功,如果连接失败则跳过 redis ,不影响全局
  135. """
  136. def __init__(self):
  137. self.pool = None
  138. self.host = "r-bp1mb0v08fqi4hjffu.redis.rds.aliyuncs.com"
  139. self.port = 6379
  140. self.db = 2
  141. self.password = "Wqsd@2019"
  142. def connect(self):
  143. """
  144. connect to redis server
  145. :return: bool
  146. """
  147. try:
  148. self.pool = redis.Redis(
  149. host=self.host, port=self.port, db=self.db, password=self.password
  150. )
  151. return True
  152. except Exception as e:
  153. print("connect to redis fail, the reason is {}".format(e))
  154. return False
  155. def select(self, key):
  156. """
  157. read info from redis
  158. :return:
  159. """
  160. return self.pool.get(key)
  161. def insert(self, key, value, expire_time):
  162. """
  163. insert info from redis
  164. :return:
  165. """
  166. self.pool.set(key, value, expire_time)
  167. def delete(self, key):
  168. """
  169. delete key
  170. :param key:
  171. :return:
  172. """
  173. self.pool.delete(key)