db_api.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. import redis
  2. import pymysql
  3. """
  4. mysql数据库和redis数据库相关功能函数
  5. """
  6. class MysqlHelper:
  7. @classmethod
  8. def connect_mysql(cls, env, machine):
  9. """
  10. :param env: dev线下测试, prod线上
  11. :param machine: 服务器的名称
  12. :return:
  13. """
  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. # 从数据库读取数据
  52. @classmethod
  53. def get_values(cls, log_type, crawler, sql, env, machine):
  54. """
  55. :param log_type: 日志命名格式
  56. :param crawler: 爬虫名称,比如说公众号,看一看之类
  57. :param sql: 查询的sql语句
  58. :param env: dev测试版本, prod线上版本
  59. :param machine: 服务器
  60. :return:
  61. """
  62. try:
  63. # 连接数据库
  64. connect = cls.connect_mysql(env, machine)
  65. # 返回一个 Cursor对象
  66. mysql = connect.cursor()
  67. # 执行 sql 语句
  68. mysql.execute(sql)
  69. # fetchall方法返回的是一个元组,里面每个元素也是元组,代表一行记录
  70. data = mysql.fetchall()
  71. # 关闭数据库连接
  72. connect.close()
  73. # 返回查询结果,元组
  74. return data
  75. except Exception as e:
  76. print(f"get_values异常:{e}\n")
  77. # Common.logger(log_type, crawler).error(f"get_values异常:{e}\n")
  78. # 更新数据库表单
  79. @classmethod
  80. def update_values(cls, log_type, crawler, sql, env, machine):
  81. # 连接数据库
  82. connect = cls.connect_mysql(env, machine)
  83. # 返回一个 Cursor对象
  84. mysql = connect.cursor()
  85. try:
  86. # 执行 sql 语句
  87. res = mysql.execute(sql)
  88. # 注意 一定要commit,否则添加数据不生效
  89. connect.commit()
  90. return res
  91. except Exception as e:
  92. # Common.logger(log_type, crawler).error(f"update_values异常,进行回滚操作:{e}\n")
  93. # 发生错误时回滚
  94. connect.rollback()
  95. # 关闭数据库连接
  96. connect.close()
  97. class RedisHelper:
  98. @classmethod
  99. def connect_redis(cls, env, machine):
  100. if machine == "aliyun_hk":
  101. redis_pool = redis.ConnectionPool(
  102. # host='r-bp154bpw97gptefiqk.redis.rds.aliyuncs.com', # 内网地址
  103. host="r-bp154bpw97gptefiqkpd.redis.rds.aliyuncs.com", # 外网地址
  104. port=6379,
  105. db=2,
  106. password="Qingqu2019",
  107. )
  108. redis_conn = redis.Redis(connection_pool=redis_pool)
  109. elif env == "prod":
  110. redis_pool = redis.ConnectionPool(
  111. host="r-bp1mb0v08fqi4hjffu.redis.rds.aliyuncs.com", # 内网地址
  112. # host='r-bp1mb0v08fqi4hjffupd.redis.rds.aliyuncs.com', # 外网地址
  113. port=6379,
  114. db=2,
  115. password="Qingqu2019",
  116. )
  117. redis_conn = redis.Redis(connection_pool=redis_pool)
  118. else:
  119. redis_pool = redis.ConnectionPool(
  120. # host='r-bp154bpw97gptefiqk.redis.rds.aliyuncs.com', # 内网地址
  121. host="r-bp154bpw97gptefiqkpd.redis.rds.aliyuncs.com", # 外网地址
  122. port=6379,
  123. db=2,
  124. password="Qingqu2019",
  125. )
  126. redis_conn = redis.Redis(connection_pool=redis_pool)
  127. return redis_conn
  128. @classmethod
  129. def redis_push(cls, env, machine, data):
  130. redis_conn = cls.connect_redis(env, machine)
  131. # print("开始写入数据")
  132. redis_conn.lpush(machine, data)
  133. # print("数据写入完成")
  134. @classmethod
  135. def redis_pop(cls, env, machine):
  136. redis_conn = cls.connect_redis(env, machine)
  137. if redis_conn.llen(machine) == 0:
  138. return None
  139. else:
  140. return redis_conn.rpop(machine)