|
|
@@ -768,13 +768,49 @@ SET IDENTITY_INSERT {table_name.lower()} OFF;
|
|
|
return script
|
|
|
|
|
|
|
|
|
+class KingbaseConvertor(PostgreSQLConvertor):
|
|
|
+ def __init__(self, src):
|
|
|
+ super().__init__(src)
|
|
|
+ self.db_type = "Kingbase"
|
|
|
+
|
|
|
+ def gen_create(self, ddl: Dict) -> str:
|
|
|
+ """生成 create"""
|
|
|
+
|
|
|
+ def _generate_column(col):
|
|
|
+ name = col["name"].lower()
|
|
|
+ if name == "deleted":
|
|
|
+ return "deleted int2 NOT NULL DEFAULT 0"
|
|
|
+
|
|
|
+ type = col["type"].lower()
|
|
|
+ full_type = self.translate_type(type, col["size"])
|
|
|
+ nullable = "NULL" if col["nullable"] else "NOT NULL"
|
|
|
+ default = f"DEFAULT {col['default']}" if col["default"] is not None else ""
|
|
|
+ return f"{name} {full_type} {nullable} {default}"
|
|
|
+
|
|
|
+ table_name = ddl["table_name"].lower()
|
|
|
+ columns = [f"{_generate_column(col).strip()}" for col in ddl["columns"]]
|
|
|
+ filed_def_list = ",\n ".join(columns)
|
|
|
+ script = f"""-- ----------------------------
|
|
|
+-- Table structure for {table_name}
|
|
|
+-- ----------------------------
|
|
|
+DROP TABLE IF EXISTS {table_name};
|
|
|
+CREATE TABLE {table_name} (
|
|
|
+ {filed_def_list}
|
|
|
+);"""
|
|
|
+
|
|
|
+ # Kingbase INSERT '' 不能通过 NOT NULL 校验
|
|
|
+ script = script.replace("NOT NULL DEFAULT ''", "NULL DEFAULT ''")
|
|
|
+
|
|
|
+ return script
|
|
|
+
|
|
|
+
|
|
|
def main():
|
|
|
parser = argparse.ArgumentParser(description="芋道系统数据库转换工具")
|
|
|
parser.add_argument(
|
|
|
"type",
|
|
|
type=str,
|
|
|
help="目标数据库类型",
|
|
|
- choices=["postgres", "oracle", "sqlserver", "dm8"],
|
|
|
+ choices=["postgres", "oracle", "sqlserver", "dm8", "kingbase"],
|
|
|
)
|
|
|
args = parser.parse_args()
|
|
|
|
|
|
@@ -788,6 +824,8 @@ def main():
|
|
|
convertor = SQLServerConvertor(sql_file)
|
|
|
elif args.type == "dm8":
|
|
|
convertor = DM8Convertor(sql_file)
|
|
|
+ elif args.type == "kingbase":
|
|
|
+ convertor = KingbaseConvertor(sql_file)
|
|
|
else:
|
|
|
raise NotImplementedError(f"不支持目标数据库类型: {args.type}")
|
|
|
|