Skip to content

Commit ef9ea6f

Browse files
authored
Add files via upload
1 parent 2e7116c commit ef9ea6f

File tree

9 files changed

+587
-0
lines changed

9 files changed

+587
-0
lines changed

README.md

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
# 🛠️ Actualizador de Base de Datos
2+
3+
[![Python](https://img.shields.io/badge/Python-3.9-blue)](https://www.python.org/)
4+
[![PyQt5](https://img.shields.io/badge/PyQt5-5.15-green)](https://pypi.org/project/PyQt5/)
5+
[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
6+
7+
---
8+
9+
# 📚 Tabla de Contenidos
10+
- [Descripción](#-descripción)
11+
- [Vista previa](#-vista-previa-de-la-aplicación)
12+
- [Características](#-características-principales)
13+
- [Instalación y requisitos](#-instalación-y-requisitos)
14+
- [Uso detallado](#-uso-detallado)
15+
- [Tecnologías utilizadas](#-tecnologías-utilizadas)
16+
- [Licencia](#-licencia)
17+
18+
---
19+
20+
## 📚 Descripción
21+
22+
**Actualizador de Base de Datos** es una potente herramienta en Python que permite actualizar registros de tablas de forma automática, fácil y segura:
23+
24+
- Carga un archivo antiguo para modificar.
25+
- Carga un archivo nuevo con datos actualizados.
26+
- Actualiza campos automáticamente según claves.
27+
- Exporta tablas completas de base de datos a CSV o Excel.
28+
- Soporta conexiones a **MySQL** y **SQL Server**.
29+
30+
Ideal para automatizar tareas de mantenimiento de bases de datos.
31+
32+
---
33+
34+
## 📸 Vista previa de la aplicación
35+
36+
*(Pronto: insertar captura de pantalla del GUI PyQt5)*
37+
38+
---
39+
40+
## ✨ Características principales
41+
42+
- Interfaz gráfica moderna con **PyQt5**.
43+
- Ordenar cualquier columna con solo hacer clic en la cabecera.
44+
- Logs de actividad informativos en cada pestaña.
45+
- Actualización de campos inteligente (solo si cambian y no están vacíos).
46+
- Exportación rápida de datos a **CSV** y **Excel**.
47+
- Configuración persistente usando `config.json`.
48+
- Soporte para dos tipos de bases de datos: **MySQL** y **SQL Server**.
49+
- Cálculo y visualización de número de registros.
50+
51+
---
52+
53+
## ⚙️ Instalación y requisitos
54+
55+
### Requisitos
56+
57+
- Python 3.8 o superior
58+
- PyQt5
59+
- pandas
60+
- openpyxl
61+
- pyodbc
62+
- pymysql
63+
64+
Instalación rápida:
65+
66+
```bash
67+
pip install -r requirements.txt
68+
```
69+
70+
**Notas adicionales:**
71+
- Para conexiones SQL Server debes tener instalado un driver ODBC compatible.
72+
- Para conexiones MySQL debes asegurarte que `pymysql` esté disponible.
73+
74+
---
75+
76+
## 🚀 Uso detallado
77+
78+
### Configuración inicial
79+
80+
1. Abre la aplicación.
81+
2. Dirígete a la pestaña **"Configuración (Base de Datos)"**.
82+
3. Introduce:
83+
- Servidor
84+
- Puerto
85+
- Usuario
86+
- Contraseña
87+
- Nombre de la base de datos
88+
- Nombre de la tabla
89+
- Tipo de base de datos (MySQL o SQL Server)
90+
4. Haz clic en **"Guardar Configuración"**.
91+
92+
### Operaciones en la Base de Datos
93+
94+
- Puedes hacer clic en **"Leer y Mostrar Tabla"** para ver una vista previa de la tabla.
95+
- Luego puedes exportar la tabla directamente a un archivo CSV o Excel.
96+
97+
### Actualizar Datos desde Archivos
98+
99+
1. Ve a la pestaña **"Principal (Actualizar Datos)"**.
100+
2. Carga el **archivo a modificar**.
101+
3. Carga el **archivo con los datos nuevos**.
102+
4. Selecciona:
103+
- El campo a actualizar
104+
- El campo clave (para emparejar registros)
105+
5. Haz clic en **"Actualizar Datos"**.
106+
6. Revisa los cambios en la vista previa.
107+
7. Exporta el archivo actualizado si lo deseas.
108+
109+
---
110+
111+
## 💪 Tecnologías utilizadas
112+
113+
- [Python](https://www.python.org/)
114+
- [PyQt5](https://pypi.org/project/PyQt5/)
115+
- [pandas](https://pandas.pydata.org/)
116+
- [openpyxl](https://openpyxl.readthedocs.io/en/stable/)
117+
- [pyodbc](https://github.com/mkleehammer/pyodbc)
118+
- [pymysql](https://pymysql.readthedocs.io/en/latest/)
119+
120+
---
121+
122+
## 📄 Licencia
123+
124+
Este proyecto está licenciado bajo la licencia **MIT**. Consulta el archivo [LICENSE](LICENSE) para más detalles.
125+
126+
---
127+
128+
> Desarrollado con ❤️ por
129+

config.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"host": "",
3+
"port": 3306,
4+
"user": "",
5+
"password": "",
6+
"database": "",
7+
"table": "",
8+
"db_type": "MySQL"
9+
}

db_utils.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import pandas as pd
2+
import mysql.connector
3+
import pyodbc
4+
5+
def conectar_y_leer_tabla(host, usuario, contraseña, base_datos, tabla, puerto=3306, tipo_bd="MySQL"):
6+
if tipo_bd == "MySQL":
7+
conn = mysql.connector.connect(
8+
host=host,
9+
user=usuario,
10+
password=contraseña,
11+
database=base_datos,
12+
port=puerto
13+
)
14+
query = f"SELECT * FROM {tabla}"
15+
df = pd.read_sql(query, conn)
16+
conn.close()
17+
return df
18+
elif tipo_bd == "SQL Server":
19+
conn = pyodbc.connect(
20+
f"DRIVER={{SQL Server}};"
21+
f"SERVER={host},{puerto};"
22+
f"DATABASE={base_datos};"
23+
f"UID={usuario};"
24+
f"PWD={contraseña};"
25+
f"Encrypt=no;"
26+
)
27+
query = f"SELECT * FROM {tabla}"
28+
df = pd.read_sql(query, conn)
29+
conn.close()
30+
return df
31+
else:
32+
raise ValueError("Tipo de base de datos no soportado: " + tipo_bd)
33+
34+
def exportar_dataframe(df, ruta_salida):
35+
if ruta_salida.endswith('.csv'):
36+
df.to_csv(ruta_salida, index=False)
37+
elif ruta_salida.endswith('.xlsx'):
38+
df.to_excel(ruta_salida, index=False)
39+
else:
40+
raise ValueError("Extensión de archivo no soportada (.csv o .xlsx)")

file_utils.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import pandas as pd
2+
from PyQt5.QtWidgets import QTableWidgetItem
3+
4+
def cargar_archivo(ruta_archivo):
5+
if ruta_archivo.endswith('.csv'):
6+
df = pd.read_csv(ruta_archivo)
7+
elif ruta_archivo.endswith('.xlsx'):
8+
df = pd.read_excel(ruta_archivo)
9+
else:
10+
raise ValueError("Formato de archivo no soportado")
11+
return df
12+
13+
def mostrar_dataframe_en_tabla(df, tabla):
14+
tabla.clear()
15+
tabla.setRowCount(df.shape[0])
16+
tabla.setColumnCount(df.shape[1])
17+
tabla.setHorizontalHeaderLabels(df.columns)
18+
19+
for i in range(df.shape[0]):
20+
for j in range(df.shape[1]):
21+
item = QTableWidgetItem(str(df.iat[i, j]))
22+
tabla.setItem(i, j, item)
23+
24+
tabla.resizeColumnsToContents()
25+
26+
def actualizar_combobox_con_columnas(df, combobox):
27+
combobox.clear()
28+
combobox.addItems(df.columns)

0 commit comments

Comments
 (0)