database.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import mysql.connector
  4. import mysql.connector.pooling
  5. import redis
  6. from mysql.connector import errorcode
  7. import time
  8. from initialize import app, logger
  9. __author__ = 'James Iter'
  10. __date__ = '16/6/8'
  11. __contact__ = 'james.iter.cn@gmail.com'
  12. __copyright__ = '(c) 2016 by James Iter.'
  13. class Database(object):
  14. cnxpool = None
  15. r = None
  16. def __init__(self):
  17. pass
  18. @classmethod
  19. def init_conn_mysql(cls):
  20. try:
  21. cls.cnxpool = mysql.connector.pooling.MySQLConnectionPool(
  22. host=app.config["db_host"],
  23. user=app.config["db_user"],
  24. password=app.config["db_password"],
  25. port=app.config["db_port"],
  26. database=app.config["db_name"],
  27. raise_on_warnings=app.config["debug"],
  28. pool_size=app.config["db_pool_size"],
  29. charset=app.config["db_charset"]
  30. )
  31. except mysql.connector.Error as err:
  32. if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
  33. e_msg = u'用户名或密码错误'
  34. elif err.errno == errorcode.ER_BAD_DB_ERROR:
  35. e_msg = u'数据库不存在'
  36. else:
  37. e_msg = err.msg
  38. print(e_msg)
  39. exit(err.errno)
  40. @classmethod
  41. def keepalived_mysql(cls):
  42. def ping(label='', _cnxpool=None):
  43. if _cnxpool is None:
  44. logger.critical(''.join(['cnxpool must not None by ', label]))
  45. return
  46. try:
  47. _cnx = _cnxpool.get_connection()
  48. _cnx.ping(attempts=1, delay=0)
  49. except mysql.connector.errors.InterfaceError as err:
  50. logger.critical(err.msg)
  51. except mysql.connector.Error as err:
  52. logger.error(err)
  53. else:
  54. _cnx.close()
  55. while True:
  56. time.sleep(5)
  57. ping(label='', _cnxpool=cls.cnxpool)
  58. @classmethod
  59. def init_conn_redis(cls):
  60. cls.r = redis.StrictRedis(host=app.config.get('redis_host', '127.0.0.1'),
  61. port=app.config.get('redis_port', 6379),
  62. db=app.config.get('redis_dbid', 0), decode_responses=True)
  63. try:
  64. cls.r.ping()
  65. except redis.exceptions.ResponseError as e:
  66. logger.warn(e.message)
  67. cls.r = redis.StrictRedis(host=app.config.get('redis_host', '127.0.0.1'),
  68. port=app.config.get('redis_port', 6379),
  69. db=app.config.get('redis_dbid', 0), password=app.config.get('redis_password', ''),
  70. decode_responses=True)