Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 
 
 
 
 

109 rindas
3.6 KiB

  1. import frappe
  2. from frappe import _
  3. from frappe.database.schema import DBTable
  4. class MariaDBTable(DBTable):
  5. def create(self):
  6. additional_definitions = ""
  7. engine = self.meta.get("engine") or "InnoDB"
  8. varchar_len = frappe.db.VARCHAR_LEN
  9. # columns
  10. column_defs = self.get_column_definitions()
  11. if column_defs:
  12. additional_definitions += ',\n'.join(column_defs) + ',\n'
  13. # index
  14. index_defs = self.get_index_definitions()
  15. if index_defs:
  16. additional_definitions += ',\n'.join(index_defs) + ',\n'
  17. # create table
  18. query = f"""create table `{self.table_name}` (
  19. name varchar({varchar_len}) not null primary key,
  20. creation datetime(6),
  21. modified datetime(6),
  22. modified_by varchar({varchar_len}),
  23. owner varchar({varchar_len}),
  24. docstatus int(1) not null default '0',
  25. parent varchar({varchar_len}),
  26. parentfield varchar({varchar_len}),
  27. parenttype varchar({varchar_len}),
  28. idx int(8) not null default '0',
  29. {additional_definitions}
  30. index parent(parent),
  31. index modified(modified))
  32. ENGINE={engine}
  33. ROW_FORMAT=DYNAMIC
  34. CHARACTER SET=utf8mb4
  35. COLLATE=utf8mb4_unicode_ci"""
  36. frappe.db.sql(query)
  37. def alter(self):
  38. for col in self.columns.values():
  39. col.build_for_alter_table(self.current_columns.get(col.fieldname.lower()))
  40. add_column_query = []
  41. modify_column_query = []
  42. add_index_query = []
  43. drop_index_query = []
  44. columns_to_modify = set(self.change_type + self.add_unique + self.set_default)
  45. for col in self.add_column:
  46. add_column_query.append("ADD COLUMN `{}` {}".format(col.fieldname, col.get_definition()))
  47. for col in columns_to_modify:
  48. modify_column_query.append("MODIFY `{}` {}".format(col.fieldname, col.get_definition()))
  49. for col in self.add_index:
  50. # if index key does not exists
  51. if not frappe.db.has_index(self.table_name, col.fieldname + '_index'):
  52. add_index_query.append("ADD INDEX `{}_index`(`{}`)".format(col.fieldname, col.fieldname))
  53. for col in self.drop_index + self.drop_unique:
  54. if col.fieldname != 'name': # primary key
  55. current_column = self.current_columns.get(col.fieldname.lower())
  56. unique_constraint_changed = current_column.unique != col.unique
  57. if unique_constraint_changed and not col.unique:
  58. # nosemgrep
  59. unique_index_record = frappe.db.sql("""
  60. SHOW INDEX FROM `{0}`
  61. WHERE Key_name=%s
  62. AND Non_unique=0
  63. """.format(self.table_name), (col.fieldname), as_dict=1)
  64. if unique_index_record:
  65. drop_index_query.append("DROP INDEX `{}`".format(unique_index_record[0].Key_name))
  66. index_constraint_changed = current_column.index != col.set_index
  67. # if index key exists
  68. if index_constraint_changed and not col.set_index:
  69. # nosemgrep
  70. index_record = frappe.db.sql("""
  71. SHOW INDEX FROM `{0}`
  72. WHERE Key_name=%s
  73. AND Non_unique=1
  74. """.format(self.table_name), (col.fieldname + '_index'), as_dict=1)
  75. if index_record:
  76. drop_index_query.append("DROP INDEX `{}`".format(index_record[0].Key_name))
  77. try:
  78. for query_parts in [add_column_query, modify_column_query, add_index_query, drop_index_query]:
  79. if query_parts:
  80. query_body = ", ".join(query_parts)
  81. query = "ALTER TABLE `{}` {}".format(self.table_name, query_body)
  82. frappe.db.sql(query)
  83. except Exception as e:
  84. # sanitize
  85. if e.args[0]==1060:
  86. frappe.throw(str(e))
  87. elif e.args[0]==1062:
  88. fieldname = str(e).split("'")[-2]
  89. frappe.throw(_("{0} field cannot be set as unique in {1}, as there are non-unique existing values").format(
  90. fieldname, self.table_name))
  91. elif e.args[0]==1067:
  92. frappe.throw(str(e.args[1]))
  93. else:
  94. raise e