create_table.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on 2018-08-28 17:38:43
  4. ---------
  5. @summary: 根据json生成表
  6. ---------
  7. @author: Boris
  8. @email: boris_liu@foxmail.com
  9. """
  10. import sys
  11. import time
  12. import feapder.setting as setting
  13. import feapder.utils.tools as tools
  14. from feapder.db.mysqldb import MysqlDB
  15. from feapder.utils.tools import key2underline
  16. class CreateTable:
  17. def __init__(self):
  18. self._db = MysqlDB()
  19. def is_vaild_date(self, date):
  20. try:
  21. if ":" in date:
  22. time.strptime(date, "%Y-%m-%d %H:%M:%S")
  23. else:
  24. time.strptime(date, "%Y-%m-%d")
  25. return True
  26. except:
  27. return False
  28. def get_key_type(self, value):
  29. try:
  30. value = eval(value)
  31. except:
  32. value = value
  33. key_type = "varchar(255)"
  34. if isinstance(value, int):
  35. key_type = "int"
  36. elif isinstance(value, float):
  37. key_type = "double"
  38. elif isinstance(value, str):
  39. if self.is_vaild_date(value):
  40. if ":" in value:
  41. key_type = "datetime"
  42. else:
  43. key_type = "date"
  44. elif len(value) > 255:
  45. key_type = "text"
  46. else:
  47. key_type = "varchar(255)"
  48. return key_type
  49. def get_data(self):
  50. """
  51. @summary: 从控制台读取多行
  52. ---------
  53. ---------
  54. @result:
  55. """
  56. data = ""
  57. while True:
  58. line = sys.stdin.readline().strip()
  59. if not line:
  60. break
  61. data += line
  62. return tools.get_json(data)
  63. def create(self, table_name):
  64. # 输入表字段
  65. print('请输入表数据 json格式 如 {"name":"张三"}\n等待输入:\n')
  66. data = self.get_data()
  67. if not isinstance(data, dict):
  68. raise Exception("表数据格式不正确")
  69. # 拼接表结构
  70. sql = """
  71. CREATE TABLE `{db}`.`{table_name}` (
  72. `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id 自动递增',
  73. {other_key}
  74. `gtime` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '抓取时间',
  75. PRIMARY KEY (`id`),
  76. {unique}
  77. ) COMMENT='';
  78. """
  79. print("请设置注释 回车跳过")
  80. other_key = ""
  81. for key, value in data.items():
  82. key = key2underline(key)
  83. key_type = self.get_key_type(value)
  84. comment = input("%s : %s -> comment:" % (key, key_type))
  85. other_key += "`{key}` {key_type} COMMENT '{comment}',\n ".format(
  86. key=key, key_type=key_type, comment=comment
  87. )
  88. print("\n")
  89. while True:
  90. is_need_batch_date = input("是否添加batch_date 字段 (y/n):")
  91. if is_need_batch_date == "y":
  92. other_key += "`{key}` {key_type} COMMENT '{comment}',\n ".format(
  93. key="batch_date", key_type="date", comment="批次时间"
  94. )
  95. break
  96. elif is_need_batch_date == "n":
  97. break
  98. print("\n")
  99. while True:
  100. unique = input("请设置唯一索引, 多个逗号间隔\n等待输入:\n").replace(",", ",")
  101. if unique:
  102. break
  103. unique = "UNIQUE `idx` USING BTREE (`%s`) comment ''" % "`,`".join(
  104. unique.split(",")
  105. )
  106. sql = sql.format(
  107. db=setting.MYSQL_DB,
  108. table_name=table_name,
  109. other_key=other_key,
  110. unique=unique,
  111. )
  112. print(sql)
  113. self._db.execute(sql)
  114. print("\n%s 创建成功" % table_name)