PageRenderTime 62ms CodeModel.GetById 34ms RepoModel.GetById 1ms app.codeStats 0ms

/bin/db/mysql.py

https://bitbucket.org/gieffe/mysqlweb
Python | 133 lines | 125 code | 8 blank | 0 comment | 8 complexity | b97084d7a6b520834315c8eb2e3e53f4 MD5 | raw file
  1. import MySQLdb
  2. from .dbapi import DBApi, DatabaseError
  3. MySQLError = MySQLdb.DatabaseError
  4. class MySQL(DBApi):
  5. @classmethod
  6. def connect(cls, pard):
  7. host = pard['HOST']
  8. user = pard['USER']
  9. passwd = pard['PASSWORD']
  10. db = pard['DB']
  11. pair = host.split(':')
  12. if len(pair) == 2:
  13. host = pair[0]
  14. port = int(pair[1])
  15. else:
  16. port = 3306
  17. try:
  18. conn = MySQLdb.connect(host, user, passwd, db, port=port)
  19. conn.query('set names utf8mb4')
  20. except MySQLError as xxx_todo_changeme:
  21. (errno, strerror) = xxx_todo_changeme.args
  22. raise DatabaseError('%s - %s' % (str(errno), strerror))
  23. return conn
  24. @classmethod
  25. def send(cls, pard):
  26. try:
  27. return super(MySQL, cls).send(pard)
  28. except MySQLError as xxx_todo_changeme1:
  29. (errno, strerror) = xxx_todo_changeme1.args
  30. raise DatabaseError('%s - %s' % (str(errno), strerror))
  31. @classmethod
  32. def send_dict(cls, pard):
  33. try:
  34. return super(MySQL, cls).send_dict(pard)
  35. except MySQLError as xxx_todo_changeme2:
  36. (errno, strerror) = xxx_todo_changeme2.args
  37. raise DatabaseError('%s - %s' % (str(errno), strerror))
  38. @classmethod
  39. def get_db_tables_list(cls, pard):
  40. """Return the tables lists in "pard['DB']" database"""
  41. pard['sql'] = "show tables"
  42. result = cls.send(pard)
  43. tables_list = []
  44. for rec in result:
  45. tables_list.append(rec[0])
  46. return tables_list
  47. @classmethod
  48. def get_db_tables_list_like(cls, pard):
  49. """Return the tables lists in "pard['DB']" database
  50. where table name is like pard['table_search']"""
  51. pard['sql'] = "show tables like '%(table_search)s%%'" % pard
  52. result = cls.send(pard)
  53. tables_list = []
  54. for rec in result:
  55. tables_list.append(rec[0])
  56. return tables_list
  57. @classmethod
  58. def get_primary_key(cls, pard):
  59. """Return the primary key columns lists for pard['db_table']"""
  60. pard['sql'] = "show index from %(db_table)s where key_name = 'primary'" % pard
  61. try:
  62. result = cls.send_dict(pard)
  63. except DatabaseError:
  64. pard['sql'] = "show index from %(db_table)s" % pard
  65. result = cls.send_dict(pard)
  66. primary_key = []
  67. for rec in result['rows']:
  68. if rec['Key_name'] == 'PRIMARY':
  69. primary_key.append(rec['Column_name'])
  70. return primary_key
  71. @classmethod
  72. def show_columns(cls, pard, out='dict'):
  73. """Return columns description from pard['table_name']
  74. The rows are formatted as a list of dictionaries by default.
  75. """
  76. if 'db_table' in pard:
  77. pard['table_name'] = pard.get('table_name', pard['db_table'])
  78. pard['sql'] = "show columns from %(table_name)s" % pard
  79. pard['fetch_all_row'] = True
  80. result = cls.send_dict(pard)
  81. if out == 'dict':
  82. return result['rows']
  83. elif out == 'list':
  84. l = []
  85. for rec in result['rows']:
  86. l.append(rec['Field'])
  87. return l
  88. @classmethod
  89. def show_index(cls, pard):
  90. """Return (primary_key_column_list, other_index_description)
  91. from pard['table_name']
  92. """
  93. pard['sql'] = "show index from %(table_name)s" % pard
  94. pard['fetch_all_row'] = True
  95. result = cls.send_dict(pard)
  96. primary_key = []
  97. index = {}
  98. for rec in result['rows']:
  99. if rec['Key_name'] == 'PRIMARY':
  100. primary_key.append(rec['Column_name'])
  101. elif rec['Key_name'] not in index:
  102. index[rec['Key_name']] = {
  103. 'index_name': rec['Key_name'],
  104. 'columns': [rec['Column_name']],
  105. 'Non_unique': rec['Non_unique']
  106. }
  107. else:
  108. index[rec['Key_name']]['columns'].append(rec['Column_name'])
  109. index_list = []
  110. for key in list(index.keys()):
  111. index_list.append(index[key])
  112. return primary_key, index_list
  113. @classmethod
  114. def show_create_table(cls, pard):
  115. pard['sql'] = 'show create table %(table_name)s' % pard
  116. result = cls.send(pard)
  117. if result:
  118. return result[0][1]
  119. else:
  120. return ''