Carga de datos con Python
Clase 15 de 25 • Curso de Fundamentos de ETL con Python y Pentaho
Contenido del curso
Clase 15 de 25 • Curso de Fundamentos de ETL con Python y Pentaho
Contenido del curso
Liliana Andrea Bobadilla Duran
Yhomira Alexandra Yupayccana Lopa
Alfredo Olmedo
Bryan Carvajal
Stanley Melgar
Mario Alexander Vargas Celis
Mario Alexander Vargas Celis
Alejandro Alberto Pachas Chavez
Llevo mucho tiempo luchando con esto. Tengo la configuración realizada de todos los pasos de configuración, la conexión a nivel de base de datos con redshift fue exitosa y tengo las tablas creadas también. El punto del error principal es al realizar la conexión.
Yo le agrege la linea 4 y 7 ya que al imprimir las variables de entorno me salia None y me di cuenta que no llamaba bien las variables de entorno en mi caso hice un documento .env para declarar esas variables. Espero que sea de ayuda me salia el mismo error y tambien me conectaba bien por base de datos.
Este error se debe a que el servicio denegó el acceso. Para solucionarlo, te recomiendo revisar todos los parámetros, como la IP, los puertos, las variables de entorno y los permisos. Es importante configurar los permisos de entrada y salida en el proveedor de servicios, ya sea AWS, GCP, etc. Sin los permisos configurados adecuadamente, no te permitirán conectarte.
Me pasa que las variables de entorno ya estan definidas pero el dataspell no las reconoce, noc que hacer a este punto ya he intentado de todo... me podrian ayudar?
Si aportas más información sobre cómo definiste las variables, desde que SO y demás se te puede ayudar a solventar la situación.
Para el que giera meter mas seguridad.
Un archivo .env se utiliza para almacenar configuraciones sensibles o variables de entorno de un proyecto, como credenciales, configuraciones de conexión y otros parámetros que no deseas incluir directamente en tu código fuente. Es una práctica común para mantener tu código seguro y facilitar la configuración de entornos (desarrollo, pruebas, producción).
¿Qué puede contener un archivo .env?
Un archivo .env suele tener pares clave-valor separados por un signo igual =. Por ejemplo:
DB_HOST=localhost DB_PORT=5432 DB_NAME=my_database DB_USER=admin DB_PASSWORD=securepassword SECRET_KEY=mysecretkey123 DEBUG=True
¿Cómo usar un archivo .env en Python?
Python puede manejar archivos .env utilizando librerías como python-dotenv. Esta librería carga automáticamente las variables definidas en el archivo .env y las hace accesibles a través de os.environ.
1. Instalar python-dotenv
Primero, instala la librería usando pip:
pip install python-dotenv
2. Crear un archivo .env
Guarda tus credenciales y configuraciones en un archivo .env en el directorio raíz de tu proyecto:
DB_HOST=localhost DB_PORT=5432 DB_NAME=my_database DB_USER=admin DB_PASSWORD=securepassword
3. Cargar y usar las variables en Python
Carga las variables en tu código utilizando python-dotenv y el módulo os:
from dotenv import load_dotenv import os
# Cargar las variables del archivo .env load_dotenv()
# Obtener las variables db_host = os.getenv('DB_HOST') db_port = os.getenv('DB_PORT') db_name = os.getenv('DB_NAME') db_user = os.getenv('DB_USER') db_password = os.getenv('DB_PASSWORD')
# Usar las variables (ejemplo con SQLAlchemy) from sqlalchemy import create_engine
engine = create_engine(f"postgresql+psycopg2://{db_user}:{db_password}@{db_host}:{db_port}/{db_name}") print("Conexión exitosa.")
Ventajas de usar .env:
Buenas prácticas:
No incluir .env en el repositorio: Agrega el archivo .env a tu .gitignore para evitar subirlo a GitHub o a cualquier otro sistema de control de versiones:# .gitignore
.env
Usar variables descriptivas: Nombres claros como DB_HOST o API_KEY ayudan a entender su propósito.
Con estas configuraciones, puedes manejar datos sensibles de manera segura y profesional en tus proyectos Python.
La **carga de datos con Python** es el paso final en un proceso de ETL (Extracción, Transformación y Carga). En este proceso, los datos ya transformados se insertan en el sistema de destino, como un Data Warehouse, una base de datos relacional o un servicio en la nube. Aquí te explico cómo realizar la carga utilizando Python y la librería pandas en combinación con SQLAlchemy y psycopg2.
### Pasos para cargar datos:
#### 1. **Preparar los datos**Los datos deben estar en un formato estructurado (como un DataFrame de pandas) y listos para cargarse en la base de datos destino.
\# Datos de ejemplodata = { 'product\_id': \[1, 2, 3], 'product\_name': \['Laptop', 'Mouse', 'Keyboard'], 'sales': \[1200, 300, 450]} df = pd.DataFrame(data)``` \#### 2. \*\*Configurar la conexión\*\*Usa `SQLAlchemy` para conectarte a la base de datos. Configura correctamente el \*\*string de conexión\*\* con las credenciales y el host de tu base de datos. ```pythonfrom sqlalchemy import create\_engine \# String de conexión para una base de datos PostgreSQL o Amazon Redshiftengine = create\_engine("postgresql+psycopg2://username:password@host:port/database")``` Reemplaza:- `username`: Nombre de usuario- `password`: Contraseña- `host`: Dirección del servidor- `port`: Puerto (por ejemplo, `5439` para Redshift)- `database`: Nombre de la base de datos \#### 3. \*\*Escribir los datos en la base\*\*Utiliza el método `to\_sql` de pandas para insertar el DataFrame en una tabla. ```python# Cargar los datos en la base de datosdf.to\_sql( name='sales\_data', # Nombre de la tabla destino con=engine, # Conexión a la base de datos if\_exists='replace', # Qué hacer si la tabla ya existe ('replace', 'append', 'fail') index=False # Si no quieres cargar el índice del DataFrame como columna) print("Datos cargados correctamente.")``` \#### 4. \*\*Verificar la carga\*\*Consulta la base de datos para asegurarte de que los datos se han cargado correctamente. ```python# Leer los datos para verificardf\_loaded = pd.read\_sql("SELECT \* FROM sales\_data", con=engine)print(df\_loaded)``` \### Ejemplo completo: ```pythonimport pandas as pdfrom sqlalchemy import create\_engine \# Preparar los datosdata = { 'product\_id': \[1, 2, 3], 'product\_name': \['Laptop', 'Mouse', 'Keyboard'], 'sales': \[1200, 300, 450]}df = pd.DataFrame(data) \# Configurar conexiónengine = create\_engine("postgresql+psycopg2://username:password@host:port/database") \# Cargar datos en la base de datosdf.to\_sql( name='sales\_data', con=engine, if\_exists='replace', index=False) \# Verificar los datos cargadosdf\_loaded = pd.read\_sql("SELECT \* FROM sales\_data", con=engine)print(df\_loaded)``` \### Recomendaciones:1. \*\*Validación previa\*\*: Antes de cargar los datos, revisa que no contengan valores nulos o inconsistencias.2. \*\*Estrategia de carga\*\*: - `replace`: Sobrescribe la tabla si ya existe. - `append`: Agrega los datos nuevos sin eliminar los existentes.3. \*\*Manejo de errores\*\*: Implementa bloques `try-except` para capturar errores en la conexión o la carga. Con este enfoque puedes integrar datos a bases de datos de manera confiable en el contexto de un proceso ETL.
al momento de conectar con redshift, por alguna razón tu host solo es accesible usando la siguiente estructura:
workgroup.x.region.redshift-serverless.amazonaws.com
como ven, no estoy escribiendo el port ni el nombre de la database, eso va como parametro junto con el user y password