Compare commits

...

3 Commits

Author SHA1 Message Date
Gabriel Amaral
01858f0ba6 9090 2023-12-03 20:19:21 -03:00
Gabriel Amaral
fbecdd5af4 Co-authored-by: José Henrique <jose.henrique.ivan@gmail.com> 2023-12-02 22:44:33 -03:00
Gabriel Amaral
ccc961e5d0 Co-authored-by: José Henrique <jose.henrique.ivan@gmail.com> 2023-11-30 22:05:39 -03:00
4 changed files with 294 additions and 41 deletions

85
main.py
View File

@@ -1,22 +1,28 @@
import os import os
import getpass
import mysql.connector
from table import Table from table import Table
from sql import SQL from sql import SQL
import mysql.connector
from mysql.connector import Error from mysql.connector import Error
def main(): def main():
print("Bem-vindo!") print("Bem-vindo!")
print("Deseja utilizar um banco de dados (BD) ou um arquivo .csv (CSV)?") print("Inicialmente, os dados precisam ser importados do MySQL")
print("Caso isso já tenha sido feito, os arquivos .csv serao sobreescritos")
print("Se algum update,insert ou delete tenha sido feito, ele sera perdido")
print("Eh recomendado importar as tabelas do bando de dados pelo menos no primeiro acesso")
print("Deseja importar os dados (digite BD) ou utilizar os arquivos.csv (digite CSV)?")
escolha = input() escolha = input()
tables = {}
if escolha == "CSV": if escolha == "CSV":
print("Digite a pasta onde estão os arquivos CSV:") print("Espere os arquivos.csv carregarem...")
#print("Digite a pasta onde estão os arquivos CSV:")
#csv_folder = input() #csv_folder = input()
csv_folder = "./source" csv_folder = "./source"
tables = {}
# Seleciona todos o csv presentes na pasta # Seleciona todos o csv presentes na pasta
for file in os.listdir(csv_folder): for file in os.listdir(csv_folder):
if file.endswith(".csv"): if file.endswith(".csv"):
@@ -25,8 +31,8 @@ def main():
table.load_from_csv(f"{csv_folder}/{file}") table.load_from_csv(f"{csv_folder}/{file}")
tables[table_name] = table tables[table_name] = table
print("Tabelas carregadas:") print("\nTabelas carregadas:")
print(tables.keys()) print(', '.join(tables.keys())+"\n")
while True: while True:
print("Digite a query [0 para sair]:") print("Digite a query [0 para sair]:")
@@ -41,16 +47,43 @@ def main():
print() print()
elif escolha == "BD": elif escolha == "BD":
print("Host (localhost):")
host_name = input()
print("Database (employees):")
database_name = input()
print("User:")
user_name = input()
password_name = getpass.getpass()
try: try:
connection = mysql.connector.connect(host='localhost',
database='employees', connection = mysql.connector.connect(host=host_name,
user='employeesdb', database=database_name,
password='Employees1!') user=user_name,
password=password_name)
if connection.is_connected(): if connection.is_connected():
print("Conectado ao employees-db") print("Conectado ao employees-db")
cursor = connection.cursor() cursor = connection.cursor()
cursor.execute("SHOW TABLES")
tables_names = cursor.fetchall()
for table_name in tables_names:
# table_name = ('departments', )
table_name = table_name[0]
# table_name = 'departments'
print('Carregando', table_name)
tables[table_name] = Table(table_name)
tables[table_name].load_from_mysql(table_name,cursor)
tables[table_name].save_to_csv()
print('Carregado', table_name)
except Error as e: except Error as e:
print("Error while connecting to MySQL", e) print("Error while connecting to MySQL", e)
finally: finally:
@@ -59,6 +92,36 @@ def main():
connection.close() connection.close()
print("MySQL connection is closed") print("MySQL connection is closed")
print("Espere os arquivos.csv carregarem...")
#print("Digite a pasta onde estão os arquivos CSV:")
#csv_folder = input()
csv_folder = "./source"
tables = {}
# Seleciona todos o csv presentes na pasta
for file in os.listdir(csv_folder):
if file.endswith(".csv"):
table_name = file.split(".")[0]
table = Table(table_name)
table.load_from_csv(f"{csv_folder}/{file}")
tables[table_name] = table
print("\nTabelas carregadas:")
print(', '.join(tables.keys())+"\n")
while True:
print("Digite a query [0 para sair]:")
query = input()
if query == "0":
break
sql = SQL(tables, query)
sql.execute()
print()
else: else:
print("Fora do intervalo!") print("Fora do intervalo!")

View File

@@ -1,4 +1,4 @@
city,state,country city,state,country
London,England,United Kingdom London,England,United Kingdom
Kansas City,Kansas,United States Kansas City,Kansas,United States
Rio de Janeiro,Rio de Janeiro,Brazil city,parana,goiania
1 city state country
2 London England United Kingdom
3 Kansas City Kansas United States
4 Rio de Janeiro city Rio de Janeiro parana Brazil goiania

165
sql.py
View File

@@ -3,12 +3,24 @@ class SQL:
self.tables = tables self.tables = tables
self.query = query.replace(";", "") self.query = query.replace(";", "")
def _try_parse_int(self, value: str) -> int:
try:
return int(value)
except ValueError:
return value
# ISCOLHE * DE tabela # ISCOLHE * DE tabela
def execute(self): def execute(self):
query_parts = self.query.split(" ") query_parts = self.query.split(" ")
if query_parts[0] == "ISCOLHE": if query_parts[0] == "ISCOLHE":
self.select(query_parts) self.select(query_parts)
elif query_parts[0] == "BOTAR":
self.insert(query_parts)
elif query_parts[0] == "SUMIR":
self.delete(query_parts)
elif query_parts[0] == "UPDEITA":
self.update(query_parts)
else: else:
pass pass
@@ -29,7 +41,7 @@ class SQL:
index = query_parts.index("DONDE") index = query_parts.index("DONDE")
where_filter_column = query_parts[index + 1] where_filter_column = query_parts[index + 1]
where_filter_operator = query_parts[index + 2] where_filter_operator = query_parts[index + 2]
where_filter_value = query_parts[index + 3] where_filter_value = self._try_parse_int(query_parts[index + 3])
where_filter = [where_filter_column, where_filter_operator, where_filter_value] where_filter = [where_filter_column, where_filter_operator, where_filter_value]
# parse TABLE # parse TABLE
@@ -84,6 +96,155 @@ class SQL:
row_values = [] row_values = []
for column in column_list: for column in column_list:
column_index = tables_columns.index(column) column_index = tables_columns.index(column)
row_values.append(row[column_index]) row_values.append(str(row[column_index]))
print(', '.join(row_values)) print(', '.join(row_values))
# BOTAR tabela Coluna1,Coluna2,Coluna3 VALORES Valor1,Valor2,Valor3
def insert(self, query_parts: list) -> None:
insert_tabela = None
insert_colunas = []
insert_valores = []
index = query_parts.index("BOTAR")
insert_tabela = query_parts[index + 1]
insert_colunas = query_parts[index + 2].split(",")
insert_valores = query_parts[index + 4].split(",")
table = self.tables[insert_tabela]
row_value = []
for column_index in range(len(table.columns)):
column_name = table.columns[column_index]
try:
coluna_index = insert_colunas.index(column_name)
valor = self._try_parse_int(insert_valores[coluna_index])
except ValueError:
coluna_index = -1
valor = ""
row_value.append(valor)
table.rows.append(row_value)
table.save_to_csv()
# BOTAR tabela Coluna1,Coluna2,Coluna3 VALORES Valor1,Valor2,Valor3
def insert(self, query_parts: list) -> None:
insert_tabela = None
insert_colunas = []
insert_valores = []
index = query_parts.index("BOTAR")
insert_tabela = query_parts[index + 1]
insert_colunas = query_parts[index + 2].split(",")
insert_valores = query_parts[index + 4].split(",")
table = self.tables[insert_tabela]
row_value = []
for column_index in range(len(table.columns)):
column_name = table.columns[column_index]
try:
coluna_index = insert_colunas.index(column_name)
valor = self._try_parse_int(insert_valores[coluna_index])
except ValueError:
coluna_index = -1
valor = ""
row_value.append(valor)
table.rows.append(row_value)
table.save_to_csv()
# SUMIR tabela DONDE coluna = valor
def delete(self, query_parts: list) -> None:
delete_tabela = None
delete_coluna = None
delete_condicao = None
delete_valor = None
index = query_parts.index("SUMIR")
delete_tabela = query_parts[index + 1]
delete_coluna = query_parts[index + 3]
delete_condicao = query_parts[index + 4]
delete_valor = self._try_parse_int(query_parts[index + 5])
table = self.tables[delete_tabela]
for row in table.rows:
column_index = table.columns.index(delete_coluna)
if delete_condicao == '=' and row[column_index] == delete_valor:
table.rows.remove(row)
elif delete_condicao == '<' and row[column_index] < delete_valor:
table.rows.remove(row)
elif delete_condicao == '>' and row[column_index] > delete_valor:
table.rows.remove(row)
elif delete_condicao == '!=' and row[column_index] != delete_valor:
table.rows.remove(row)
table.save_to_csv()
# SUMIR tabela DONDE coluna = valor
def delete(self, query_parts: list) -> None:
delete_tabela = None
delete_coluna = None
delete_condicao = None
delete_valor = None
index = query_parts.index("SUMIR")
delete_tabela = query_parts[index + 1]
delete_coluna = query_parts[index + 3]
delete_condicao = query_parts[index + 4]
delete_valor = self._try_parse_int(query_parts[index + 5])
table = self.tables[delete_tabela]
column_index = table.columns.index(delete_coluna)
for row in table.rows:
if delete_condicao == '=' and row[column_index] == delete_valor:
table.rows.remove(row)
elif delete_condicao == '<' and row[column_index] < delete_valor:
table.rows.remove(row)
elif delete_condicao == '>' and row[column_index] > delete_valor:
table.rows.remove(row)
elif delete_condicao == '!=' and row[column_index] != delete_valor:
table.rows.remove(row)
table.save_to_csv()
# UPDEITA tabela coluna PARA valor DONDE coluna = valor
def update(self, query_parts: list) -> None:
update_tabela = None
update_coluna = None
update_valor = None
index = query_parts.index("UPDEITA")
update_tabela = query_parts[index + 1]
update_coluna = query_parts[index + 2]
update_valor = self._try_parse_int(query_parts[index + 4])
index = query_parts.index("DONDE")
update_where_coluna = query_parts[index + 1]
update_where_condicao = query_parts[index + 2]
update_where_valor = query_parts[index + 3]
table = self.tables[update_tabela]
update_col_index = table.columns.index(update_coluna)
where_col_index = table.columns.index(update_where_coluna)
for i in range(len(table.rows)):
if update_where_condicao == '=' and table.rows[i][where_col_index] == update_where_valor:
table.rows[i][update_col_index] = update_valor
elif update_where_condicao == '<' and table.rows[i][where_col_index] < update_where_valor:
table.rows[i][update_col_index] = update_valor
elif update_where_condicao == '>' and table.rows[i][where_col_index] > update_where_valor:
table.rows[i][update_col_index] = update_valor
elif update_where_condicao == '!=' and table.rows[i][where_col_index] != update_where_valor:
table.rows[i][update_col_index] = update_valor
table.save_to_csv()

View File

@@ -10,6 +10,12 @@ class Table:
def __repr__(self): def __repr__(self):
return self.name return self.name
def _try_parse_int(self, value: str) -> int:
try:
return int(value)
except ValueError:
return value
def load_from_csv(self, csv_file): def load_from_csv(self, csv_file):
with open(csv_file, 'r') as f: with open(csv_file, 'r') as f:
reader = f.read().splitlines() reader = f.read().splitlines()
@@ -20,33 +26,56 @@ class Table:
for row in reader: for row in reader:
row = row.split(',') row = row.split(',')
self.rows.append(row) row_list = []
def print_columns(self, column_list: list, where_filter: list = None, join_stmt: list = None): for column in row:
if column_list[0] == '*': row_list.append(self._try_parse_int(column))
column_list = self.columns
print(', '.join(column_list)) self.rows.append(row_list)
print('-' * 20)
for row in self.rows: def load_from_mysql(self, table_name, cursor):
if where_filter is not None: cursor.execute("SELECT * FROM " + table_name)
column_index = self.columns.index(where_filter[0]) rows = cursor.fetchall()
row_value = row[column_index]
if where_filter[1] == '=': for row in rows:
if row_value != where_filter[2]: row_list = []
continue
elif where_filter[1] == '>':
if row_value <= where_filter[2]:
continue
elif where_filter[1] == '<':
if row_value >= where_filter[2]:
continue
row_values = [] for col in row:
for column in column_list: row_list.append(col)
column_index = self.columns.index(column)
row_values.append(row[column_index])
print(', '.join(row_values)) self.rows.append(row_list)
'''
self.rows = [
["dp001", "Customer Service"]
]
'''
cursor.execute("SHOW COLUMNS FROM " + table_name)
columns = cursor.fetchall()
for row in columns:
self.columns.append(row[0])
def save_to_csv(self):
f = open("./source/" + self.name + ".csv", "w")
# gravar o cabeçalho
columns_line = ""
for i in range(len(self.columns)):
columns_line = columns_line + self.columns[i]
if i < len(self.columns) - 1:
columns_line = columns_line + ","
f.write(columns_line + '\n')
for line in range(len(self.rows)):
data_line = ""
for column in range(len(self.columns)):
data_line = data_line + str(self.rows[line][column])
if column < len(self.columns) - 1:
data_line = data_line + ","
f.write(data_line + '\n')
f.close()