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