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