Форум программистов, компьютерный форум, киберфорум
Наши страницы
Loafer
Войти
Регистрация
Восстановить пароль
Оценить эту запись

From Oracle to MySQL

Запись от Loafer размещена 24.04.2018 в 17:25

Установка пакета:
Bash
1
pip3 install python-docx
Наговнокодил на Python'е:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import docx
import re
import sys
 
def column_0(cell_text):
  sys.stdout.write("  `{}` ".format(cell_text.lower()))
 
def column_1(cell_text):
  if cell_text == "DATE":
    sys.stdout.write("TIMESTAMP ")
  # Поиск NUMBER
  result = re.search(r'NUMBER\((.*)\)', cell_text)
  if result:
    number = int(result.group(1))
    if 1 <= number <= 3:
      sys.stdout.write("TINYINT(3) UNSIGNED ")
    if 4 <= number <= 6:
      sys.stdout.write("SMALLINT(5) UNSIGNED ")
    if 7 <= number <= 11:
      sys.stdout.write("INT(10) UNSIGNED ")
    if 12 <= number <= 38:
      sys.stdout.write("BIGINT(20) UNSIGNED ")
    return
  # Поиск VARCHAR2
  result = re.search(r'VARCHAR2\((.*)\)', cell_text)
  if result:
    number = int(result.group(1))
    sys.stdout.write("VARCHAR({}) ".format(number))
    return
  # Другие типы
  sys.stdout.write("{} ".format(cell_text))
 
def column_2(cell_text):
  if cell_text == "Y":
    sys.stdout.write(" ")
  else:
    sys.stdout.write("NOT NULL ")
 
def column_3(cell_text):
  if cell_text:
    if cell_text.isspace():
      sys.stdout.write("")
    else:
      if cell_text == "SysDate":
        sys.stdout.write("DEFAULT CURRENT_TIMESTAMP() ")
      else:
        sys.stdout.write("DEFAULT {} ".format(cell_text))
  else:
    sys.stdout.write("")
 
def column_4(cell_text):
  sys.stdout.write("COMMENT '{}',".format(cell_text))
 
def create_table(table_name):
  sys.stdout.write("DROP TABLE IF EXISTS ESB_OUT_A_{}\p;\n".format(table_name))
  sys.stdout.write("CREATE TABLE IF NOT EXISTS ESB_OUT_A_{} (\n".format(table_name))
  sys.stdout.write("  `message_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Последовательная техническая нумерация сообщений',\n")
  sys.stdout.write("  `operation_code` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'Тип операции: 0-вставка, 1-обновление, 2-удаление',\n")
  sys.stdout.write("  `message_dt` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP() COMMENT 'Время возникновения записи в таблице, используется для расследования инцидентов',\n")
  sys.stdout.write("  `entity_id` VARCHAR(128) NOT NULL COMMENT 'ID сущности используемый в системе',\n")
  sys.stdout.write("  `receiver_id` BIGINT UNSIGNED DEFAULT NULL COMMENT 'Содержит дополнительный признак в случае повторных и корректирующих выгрузок',\n")
  sys.stdout.write("  `maintenance_flg` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'Флаг с признаком корректирующей выгрузки: 0-регламентная, 1-корректирующая',\n")
 
def end_table(table_name, comment):
  sys.stdout.write("  PRIMARY KEY(message_id)\n")
  sys.stdout.write(")\n")
  sys.stdout.write("ENGINE = InnoDB DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci COMMENT = '{}'\p;\n".format(comment))
  sys.stdout.write("\n")
  sys.stdout.write("DROP TABLE IF EXISTS ESB_OUT_H_{}\p;\n".format(table_name))
  sys.stdout.write("CREATE TABLE IF NOT EXISTS ESB_OUT_H_{}\n".format(table_name))
  sys.stdout.write("                    LIKE ESB_OUT_A_{}\p;\n\n".format(table_name))
 
def main():
  document = docx.Document('Front-Back-interface.docx')
  sql_creator = dict()
  sql_creator[0] = column_0
  sql_creator[1] = column_1
  sql_creator[2] = column_2
  sql_creator[3] = column_3
  sql_creator[4] = column_4
 
  create_table(sys.argv[3])
 
  for table_index in range(int(sys.argv[1]), int(sys.argv[2]) + 1):
    for i in range(2, len(document.tables[table_index].rows)):
      for j in range(len(document.tables[table_index].rows[i].cells)):
        cell_text = document.tables[table_index].rows[i].cells[j].text
        sql_creator[j](cell_text)
      sys.stdout.write("\n")
 
  end_table(sys.argv[3], sys.argv[4])
 
if __name__ == "__main__":
  main()
Размещено в Python
Просмотров 455 Комментарии 2
Всего комментариев 2
Комментарии
  1. Старый комментарий
    Аватар для Usaga
    И что это?
    Запись от Usaga размещена 24.04.2018 в 19:01 Usaga на форуме
  2. Старый комментарий
    Аватар для Loafer
    Говнокод, который парсит docx файл и генерирует SQL скрипт для накатки в MySQL. В docx файле содержится описание базы данных в виде таблиц документа docx. Просто залил сюда, чтобы не потерять.
    Запись от Loafer размещена 01.05.2018 в 13:37 Loafer вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru