Parse Simple Isolated Tables with only numbers as values
This commit is contained in:
parent
789f42e66a
commit
5d6ffd4814
8
pythonProject/.idea/.gitignore
vendored
Normal file
8
pythonProject/.idea/.gitignore
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
# Default ignored files
|
||||||
|
/shelf/
|
||||||
|
/workspace.xml
|
||||||
|
# Editor-based HTTP Client requests
|
||||||
|
/httpRequests/
|
||||||
|
# Datasource local storage ignored files
|
||||||
|
/dataSources/
|
||||||
|
/dataSources.local.xml
|
17
pythonProject/main.py
Normal file
17
pythonProject/main.py
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
# This is a sample Python script.
|
||||||
|
from sqlparse import SQLParser
|
||||||
|
|
||||||
|
|
||||||
|
# Press Umschalt+F10 to execute it or replace it with your code.
|
||||||
|
# Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings.
|
||||||
|
|
||||||
|
def main():
|
||||||
|
sql_tables = SQLParser.parse_sql_file("schema.sql")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Press the green button in the gutter to run the script.
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
|
|
||||||
|
# See PyCharm help at https://www.jetbrains.com/help/pycharm/
|
12
pythonProject/schema.sql
Normal file
12
pythonProject/schema.sql
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
CREATE TABLE `test` (
|
||||||
|
`id` bigint(20) NOT NULL,
|
||||||
|
`test_value` int(11) NOT NULL,
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
|
||||||
|
|
||||||
|
CREATE TABLE `test2` (
|
||||||
|
`id` bigint(20) NOT NULL,
|
||||||
|
`test_value` int(11) NOT NULL,
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
|
||||||
|
|
15
pythonProject/sqlparse/SQLColumn.py
Normal file
15
pythonProject/sqlparse/SQLColumn.py
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
from enum import Enum
|
||||||
|
|
||||||
|
|
||||||
|
class SQLColumnType(Enum):
|
||||||
|
BIGINT = 'bigint(20)'
|
||||||
|
INT = 'int(11)'
|
||||||
|
|
||||||
|
|
||||||
|
class SQLColumn:
|
||||||
|
|
||||||
|
def __init__(self, column_name: str, column_type: SQLColumnType, nullable: bool):
|
||||||
|
self.columnName = column_name
|
||||||
|
self.columnType = column_type
|
||||||
|
self.nullable = nullable
|
||||||
|
|
98
pythonProject/sqlparse/SQLParser.py
Normal file
98
pythonProject/sqlparse/SQLParser.py
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
import re
|
||||||
|
|
||||||
|
from sqlparse import SQLColumn
|
||||||
|
from sqlparse.SQLTable import SQLTable
|
||||||
|
|
||||||
|
tableNamePattern = r"CREATE TABLE `(\w+)`"
|
||||||
|
|
||||||
|
|
||||||
|
def read_sql_file(sql_path: str):
|
||||||
|
with open(sql_path, 'r') as file:
|
||||||
|
return file.read()
|
||||||
|
|
||||||
|
|
||||||
|
def split_table_definition(sql_string: str):
|
||||||
|
splitted_sql_string = sql_string.split("CREATE TABLE")
|
||||||
|
splitted_sql_string.pop(0)
|
||||||
|
for index, sql_table_string in enumerate(splitted_sql_string):
|
||||||
|
splitted_sql_string[index] = "CREATE TABLE" + sql_table_string
|
||||||
|
return splitted_sql_string
|
||||||
|
|
||||||
|
|
||||||
|
def parse_sql_file(sql_path: str):
|
||||||
|
sql_string = read_sql_file(sql_path)
|
||||||
|
sql_tables = split_table_definition(sql_string)
|
||||||
|
processed_tables = [SQLTable]
|
||||||
|
for sql_table in sql_tables:
|
||||||
|
table = parse_table_sql(sql_table)
|
||||||
|
processed_tables.append(table)
|
||||||
|
return processed_tables
|
||||||
|
|
||||||
|
|
||||||
|
def parse_table_sql(table_sql: str):
|
||||||
|
table_name = get_table_name(table_sql)
|
||||||
|
table_content = get_table_content(table_sql)
|
||||||
|
table = process_table_content(table_content, table_name)
|
||||||
|
return table
|
||||||
|
|
||||||
|
|
||||||
|
def process_table_content(table_content: str, table_name: str):
|
||||||
|
splitted_table_content = table_content.split(",")
|
||||||
|
primary_key = ""
|
||||||
|
columns = []
|
||||||
|
for column_definition in splitted_table_content:
|
||||||
|
if column_definition.startswith(" PRIMARY KEY"):
|
||||||
|
primary_key = get_primary_key(column_definition)
|
||||||
|
else:
|
||||||
|
column = parse_column_definition(column_definition)
|
||||||
|
columns.append(column)
|
||||||
|
return SQLTable(table_name, columns, primary_key)
|
||||||
|
|
||||||
|
|
||||||
|
def parse_column_definition(column_definition: str):
|
||||||
|
column_name = get_column_name(column_definition)
|
||||||
|
column_type = get_column_type(column_definition)
|
||||||
|
nullable = get_nullable(column_definition)
|
||||||
|
return SQLColumn.SQLColumn(column_name, column_type, nullable)
|
||||||
|
|
||||||
|
|
||||||
|
def get_nullable(column_definition: str):
|
||||||
|
return "NOT NULL" in column_definition
|
||||||
|
|
||||||
|
|
||||||
|
def get_column_type(column_definition: str):
|
||||||
|
splitted_column_definition = column_definition.split(" ")
|
||||||
|
for column_definition_characteristic in splitted_column_definition:
|
||||||
|
if column_definition_characteristic == 'bigint(20)':
|
||||||
|
return SQLColumn.SQLColumnType.BIGINT
|
||||||
|
elif column_definition_characteristic == 'int(11)':
|
||||||
|
return SQLColumn.SQLColumnType.INT
|
||||||
|
|
||||||
|
|
||||||
|
def get_column_name(column_definition: str):
|
||||||
|
match = re.search("`(\w+)`", column_definition)
|
||||||
|
if match:
|
||||||
|
column_name = match.group(1)
|
||||||
|
return column_name
|
||||||
|
|
||||||
|
|
||||||
|
def get_primary_key(primary_key_sql: str):
|
||||||
|
match = re.search("PRIMARY KEY \(`(\w+)`\)", primary_key_sql)
|
||||||
|
if match:
|
||||||
|
return match.group(1)
|
||||||
|
|
||||||
|
|
||||||
|
def get_table_name(sql_string: str):
|
||||||
|
match = re.search(tableNamePattern, sql_string)
|
||||||
|
if match:
|
||||||
|
table_name = match.group(1)
|
||||||
|
return table_name
|
||||||
|
|
||||||
|
|
||||||
|
def get_table_content(sql_string: str):
|
||||||
|
last_ceiling_index = sql_string.rfind(")")
|
||||||
|
first_ceiling_index = sql_string.index("(") + 1
|
||||||
|
|
||||||
|
table_content = sql_string[first_ceiling_index:last_ceiling_index]
|
||||||
|
table_content = re.compile(r"\s+").sub(" ", table_content).strip()
|
||||||
|
return table_content
|
9
pythonProject/sqlparse/SQLTable.py
Normal file
9
pythonProject/sqlparse/SQLTable.py
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
from sqlparse.SQLColumn import SQLColumn
|
||||||
|
|
||||||
|
|
||||||
|
class SQLTable:
|
||||||
|
def __init__(self, table_name, columns: [SQLColumn], primary_key: str):
|
||||||
|
self.table_name = table_name
|
||||||
|
self.columns = columns
|
||||||
|
self.primary_key = primary_key
|
||||||
|
|
Loading…
Reference in New Issue
Block a user