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 getpass
import mysql.connector
from table import Table
from sql import SQL
import mysql.connector
from mysql.connector import Error
def main():
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()
tables = {}
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 = "./source"
tables = {}
# Seleciona todos o csv presentes na pasta
for file in os.listdir(csv_folder):
if file.endswith(".csv"):
@@ -25,8 +31,8 @@ def main():
table.load_from_csv(f"{csv_folder}/{file}")
tables[table_name] = table
print("Tabelas carregadas:")
print(tables.keys())
print("\nTabelas carregadas:")
print(', '.join(tables.keys())+"\n")
while True:
print("Digite a query [0 para sair]:")
@@ -41,16 +47,43 @@ def main():
print()
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:
connection = mysql.connector.connect(host='localhost',
database='employees',
user='employeesdb',
password='Employees1!')
connection = mysql.connector.connect(host=host_name,
database=database_name,
user=user_name,
password=password_name)
if connection.is_connected():
print("Conectado ao employees-db")
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:
print("Error while connecting to MySQL", e)
finally:
@@ -59,6 +92,36 @@ def main():
connection.close()
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:
print("Fora do intervalo!")

View File

@@ -1,4 +1,4 @@
city,state,country
London,England,United Kingdom
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.query = query.replace(";", "")
def _try_parse_int(self, value: str) -> int:
try:
return int(value)
except ValueError:
return value
# ISCOLHE * DE tabela
def execute(self):
query_parts = self.query.split(" ")
if query_parts[0] == "ISCOLHE":
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:
pass
@@ -29,7 +41,7 @@ class SQL:
index = query_parts.index("DONDE")
where_filter_column = query_parts[index + 1]
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]
# parse TABLE
@@ -84,6 +96,155 @@ class SQL:
row_values = []
for column in column_list:
column_index = tables_columns.index(column)
row_values.append(row[column_index])
row_values.append(str(row[column_index]))
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):
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):
with open(csv_file, 'r') as f:
reader = f.read().splitlines()
@@ -20,33 +26,56 @@ class Table:
for row in reader:
row = row.split(',')
self.rows.append(row)
row_list = []
def print_columns(self, column_list: list, where_filter: list = None, join_stmt: list = None):
if column_list[0] == '*':
column_list = self.columns
for column in row:
row_list.append(self._try_parse_int(column))
print(', '.join(column_list))
print('-' * 20)
self.rows.append(row_list)
for row in self.rows:
if where_filter is not None:
column_index = self.columns.index(where_filter[0])
row_value = row[column_index]
def load_from_mysql(self, table_name, cursor):
cursor.execute("SELECT * FROM " + table_name)
rows = cursor.fetchall()
if where_filter[1] == '=':
if row_value != where_filter[2]:
continue
elif where_filter[1] == '>':
if row_value <= where_filter[2]:
continue
elif where_filter[1] == '<':
if row_value >= where_filter[2]:
continue
for row in rows:
row_list = []
row_values = []
for column in column_list:
column_index = self.columns.index(column)
row_values.append(row[column_index])
for col in row:
row_list.append(col)
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()