0
点赞
收藏
分享

微信扫一扫

mysql 建表语句转成 clickhouse

琛彤麻麻 2022-02-22 阅读 117
import re

ddl = """
create table `device` (
	`DeviceID` Decimal (19),
	`ClassID` int (11),
	`DeviceCode` varchar (300),
	`RegID` int (11),
	`DeptName` text ,
	`OfficeName` varchar (192),
	`FloorNumber` varchar (192),
	`RoomNumber` varchar (192),
	`UserName` varchar (192),
	`DeviceName` varchar (150),
	`AliasName` varchar (300),
	`SwitchName` varchar (300),
	`SwitchIP` varchar (60),
	`SwitchPort` varchar (60),
	`OSType` text ,
	`NumIPAddress` Decimal (19)
); 
"""
ddl = re.sub('\s+', ' ', ddl)
ddl
' create table `device` ( `DeviceID` Decimal (19), `ClassID` int (11), `DeviceCode` varchar (300), `RegID` int (11), `DeptName` text , `OfficeName` varchar (192), `FloorNumber` varchar (192), `RoomNumber` varchar (192), `UserName` varchar (192), `DeviceName` varchar (150), `AliasName` varchar (300), `SwitchName` varchar (300), `SwitchIP` varchar (60), `SwitchPort` varchar (60), `OSType` text , `NumIPAddress` Decimal (19) ); '
table_name = re.findall('(?i)create table(.*?)\(', ddl)[0].strip().strip('`')
fields = re.findall('(?i)create table.*?\((.*)\)[;]?', ddl)[0]

fields = list(map(lambda x:x.strip(), fields.split(',')))
table_name, fields
('device',
 ['`DeviceID` Decimal (19)',
  '`ClassID` int (11)',
  '`DeviceCode` varchar (300)',
  '`RegID` int (11)',
  '`DeptName` text',
  '`OfficeName` varchar (192)',
  '`FloorNumber` varchar (192)',
  '`RoomNumber` varchar (192)',
  '`UserName` varchar (192)',
  '`DeviceName` varchar (150)',
  '`AliasName` varchar (300)',
  '`SwitchName` varchar (300)',
  '`SwitchIP` varchar (60)',
  '`SwitchPort` varchar (60)',
  '`OSType` text',
  '`NumIPAddress` Decimal (19)'])
transform_dict = {
    'INT':'Int32',
    'TINYINT':'Int32',
    'SMALLINT':'Int32',
    'MEDIUMINT':'Int32',
    'BIGINT': 'Int64',
    'DECIMAL':'Int32',
    'DATE': 'Date',
    'DATETIME':'DateTime',
    'TIMESTAMP':'DateTime',
    'FLOAT':'Float32',
    'DOUBLE':'Float64'
}

def transfrom(x):
    return f'Nullable({transform_dict[x]})' if x in transform_dict else 'Nullable(String)'

fields_parts = [item.split(' ') for item in fields]
column_names = [
    item[0]
    .strip('`')
    for item in fields_parts
]
column_types = [
    transfrom(
        re.sub('\(\d+\)','',
               ' '.join(item[1:])
              )
        .strip()
        .upper()
    )
    for item in fields_parts
]

ck_ddl = """
DROP TABLE IF EXISTS `{db_name}`.`{table_name}`;
CREATE TABLE IF NOT EXISTS `{db_name}`.`{table_name}`(
{fields}
)
ENGINE = MergeTree
PARTITION BY toYYYYMMDD(DATE_FIELD)
ORDER BY (SOME_FIELDS)
SETTINGS index_granularity = 8192
""".format(
    db_name = 'temp',
    table_name = table_name,
    fields = ',\n'.join(f'\t`{col_name}` {col_type}' for col_name, col_type in zip(column_names, column_types))
)
print(ck_ddl)
DROP TABLE IF EXISTS `temp`.`device`;
CREATE TABLE IF NOT EXISTS `temp`.`device`(
	`DeviceID` Nullable(Int32),
	`ClassID` Nullable(Int32),
	`DeviceCode` Nullable(String),
	`RegID` Nullable(Int32),
	`DeptName` Nullable(String),
	`OfficeName` Nullable(String),
	`FloorNumber` Nullable(String),
	`RoomNumber` Nullable(String),
	`UserName` Nullable(String),
	`DeviceName` Nullable(String),
	`AliasName` Nullable(String),
	`SwitchName` Nullable(String),
	`SwitchIP` Nullable(String),
	`SwitchPort` Nullable(String),
	`OSType` Nullable(String),
	`NumIPAddress` Nullable(Int32)
)
ENGINE = MergeTree
PARTITION BY toYYYYMMDD(DATE_FIELD)
ORDER BY (SOME_FIELDS)
SETTINGS index_granularity = 8192


举报

相关推荐

0 条评论