Cuándo se habla del metodologías STEM o de las carreras STEM hace referencia a aquellos oficios que son considerados las «profesiones del futuro».
Su acrónico hace referencia a Science, Technology, Engineering, Math, traducido al español es Ciencias, Tecnología, Ingeniería, Matemáticas.
Science, Technology, Engineering, Math
Estudiar una carrera STEM brinda mayor empleabilidad a sus egresados, quienes desarrollan competencias transversales y habilidades que sirven para necesidades futuras de las empresas. Asimismo, tienen un amplio abanico de oportunidades labores, ya que las áreas de conocimiento STEM son comunes a todos los sectores y dan cabida a una gran cantidad de perfiles profesionales.
Las carreras STEM motivan a construir, idear, resolver, experimentar y emprender, osea, también involucran una gama amplia de habiliadades adicionales que hoy en dia son requeridas y evaluadas.
Son ideales para resolver problemas de forma creativa a través del pensamiento crítico y la innovación.
La idea es que a través de esta metodología se puede poner en práctica la teoría.
Entre las carreras por cada área están:
Ciencias
Está área está compuesta por las carreras de Medicina, Biotecnología, Enfermería, Genética, Química, Física, Biología, Astrofísica, Odontología, Psicología, Nanociencia, entre otras.
Estas carreras te entrenan para resolver problemas del mundo real por medio de teorías, conceptos y experimentos científicos. Para ello, desarrollas tu pensamiento crítico, tus habilidades investigativas y tu capacidad de análisis para llegar a conclusiones.
Tecnología
Las carreras que abarcan esta área son Ingeniería de Sistemas y Computación, Informática, Telecomunicaciones, Robótica, Software, Análisis de sistemas, Desarrollo web y Programación y Robótica.
En este ámbito, puedes desarrollar nuevos sistemas y programas, o mejoras softwares ya existentes. Y usas el razonamiento científico y datos que te permitan encontrar soluciones a distintos problemas.
Ingeniería
Es un área de área y técnica entre las carreras que puedes estudiar están: Ingeniería Naval, Arquitectura, Ingeniería Civil Ambiental, Ingeniería Industrial, Ingeniería Mecánica Eléctrica, Ingeniería de Sistemas y Computación, Ingeniería Eléctrica, la y la Ingeniería Química están entre las ramas más demandadas.
La ingeniería es uno de los campos más prácticos. Como ingeniera, debes potenciar tu creatividad y tus habilidades técnicas para resolver una amplia variedad de problemas dentro del mundo real.
Matemáticas
Si te encantan los números (como a mi), estas carreras van con tu personalidad: Estadística, Matemáticas, Economía, Análisis de Sistemas, Física, Contabilidad, entre otros.
En estas carreras aprendes a razonar, deducir y resolver problemas. Esto puede hacerlo a través del análisis datos, creando modelos e identificando patrones para proponer soluciones.
A través de los datos brindados por el Foro Económico Mundial, se conoce que en el 2022 surgieron 133 millones de trabajos que necesitarán de profesionales con habilidades vinculadas a las carreras STEM. Es decir, personas de las áreas STEM son caracterizadas por su creatividad, trabajo en equipo, capacidad analítica y habilidades matemáticas, científicas y técnicas.
Cabe agregar que el perfil de remuneración proyectado es de los más altos.
Los archivos de configuración tienen una amplia gama de aplicaciones utilizadas principalmente por los sistemas operativos para personalizar un entorno. Para los programadores o desarrolladores, la configuración de parámetros iniciales para el software sin codificar datos en el programa es uno de los casos de uso más frecuentes. Le permite modificar dicha configuración sin acceder al código fuente del programa.
En otras palabras, se le puede indicar al software que vaya a un archivo de configuración para obtener la información precisa que necesita para aquellas variables que pueden variar con el tiempo, como direcciones IP, nombres de host, nombres de usuario, contraseñas y nombres de bases de datos.
Escribir un archivo separado con código Python es la forma más sencilla de crear archivos de configuración. Puede darle un nombre como base de datosconfig.py. Luego, para evitar cargarlo involuntariamente, puede agregar la línea *<nombre de archivo> a su archivo .gitignore .
Formato del archivo de configuración
YAML, JSON, TOML e INI son los formatos populares y estandarizados de archivos de configuración.
La mayoría de los programas en python y bibliotecas aceptan fácilmente YAML e INI. INI tiene solo 1 nivel jerárquico, por lo que es la solución más simple. INI, por otro lado, no tiene tipos de datos; todo está codificado como una cadena.
Extensiones de archivos
Las extensiones de extensión dan al usuario y al sistema una pista sobre el contenido de un archivo. Los extremos razonables del archivo de configuración incluidos son:
La extensión config.py es para los archivos de Python.
La extensión .yaml / .yml es para si la configuración se realiza en formato YAML.
La extensión .json es para los archivos de configuración escritos en formato JSON.
El archivo de extensión .ini es un archivo particular que almacena datos de configuración en un formato sencillo y preestablecido.
.CFG o Varios programas utilizan un archivo de configuración con la extensión » CONFIG » para almacenar configuraciones exclusivas de su software. Mientras que algunos archivos de configuración se guardan como archivos de texto sin formato, otros pueden estar en un formato específico del programa.
Extensión ~/.[nombre de mi aplicación] En los sistemas Linux, la convención de nomenclatura para los archivos de configuración es «RC». RC es «común» y es un antiguo sistema informático.
Crear un archivo de configuración en Python
Configparser.py es un módulo de Python que simplifica la escritura, lectura y modificación de archivos .ini .
Para instalar este módulo, debe abrir su símbolo del sistema y escribir el comando dado:
pip install configparser
El objetivo principal de Configureparser es leer y escribir archivos .ini, aunque también acepta diccionarios y objetos de archivos iterables como entradas. Cada archivo .ini se divide en partes que incluyen varios pares clave-valor.
Analicemos cómo crear un archivo de configuración en Python. Siguiendo los pasos que se indican a continuación, podemos crear un archivo de configuración:
Primero, importe el módulo configparser.
Cree un objeto de configparser.ConfigParser() guárdelo en una variable.
Cree secciones según las necesidades utilizando el método .add_section(«section_name»).
Agregue pares clave-valor a la sección, usando el método .set(«sección»,»clave»,»valor»).
Para guardar la configuración: con abrir (ruta/»nombre_de_archivo.ini», «w») como nombre de archivo: config object.write(fileName)
Comprendamos cómo crear un archivo de configuración en Python tomando un ejemplo a continuación:
En el ejemplo anterior, para crear un archivo de configuración INI, necesitamos importar configparser.
Primero, hemos creado un objeto de analizador de configuración utilizando el método config parser.ConfigParser(). Para hacer secciones en el archivo INI, usamos el método .add_section («nombre de la sección»).
Para completar los valores en la sección tenemos el método .set(). Se necesitan 3 parámetros: el primero es el nombre de la sección, el segundo es el nombre de la clave o la opción y el tercero es el valor.
Después de archivar secciones, necesitamos crear un archivo de .ini. Para crear un archivo, usamos “with open()(). En estos corchetes, damos el nombre del archivo para que cree un archivo en el mismo directorio. Para escribir valor, usaremos el método .write().
Salidas del archivo database.ini
Leer el archivo de configuración
Hemos aprendido cómo construir y actualizar el archivo de configuración en Python. Ahora que se ha creado, en nuestra clase principal, leamos los valores del archivo de configuración. La parte más fácil y clara viene a continuación.
Cada configuración se mantiene como una cadena porque Configureparser no intenta adivinar los tipos de datos en el archivo de configuración. Sin embargo, ofrece algunas formas de cambiar el tipo de datos de una cadena al apropiado. El tipo más interesante es el booleano, ya que puede distinguir entre valores booleanos como «sí» y «no», «encendido» y «apagado», «verdadero» y «falso», y «1» y «0».
También podría leer desde un objeto de archivo iterable, un diccionario o una cadena usando read_dict(), read_string() o read_file ().
Comprendamos cómo leer archivos de configuración en Python tomando un ejemplo dado
abajo:
# Code goes from here
# importing config parser
import configparser
# creating the object of configparser
config_data = configparser.ConfigParser()
# reading data
config_data.read("database.ini")
# app configuration data
database = config_data["database"]
# admin data
user = config_data["user"]
print("database data")
for database_data in database:
print(f"{database_data} = {database.get(database_data)}")
print("\nuser data")
for user_data in user:
print(f"{user_data} = {user.get(user_data)}")
Salida de la lectura del archivo de configuración
En el ejemplo anterior, tenemos un archivo de configuración » example.ini «. Intentemos leerlo. Para leer un archivo INI, necesitamos importar el módulo configparser.py. Ahora creamos un objeto de analizador de configuración usando el método config parser.ConfigParser() . En este momento, este objeto no tiene ningún dato. Podemos leer un archivo externo usando .read.
Tenemos 2 secciones en el archivo ini. Una es la sección de la base de datos y otra es la sección del usuario. Almacenemos estas secciones en diferentes nombres de variables como base de datos y usuarios.
Ahora, al usar for loop, iteramos en estas secciones e imprimimos estos valores para verificar si obtenemos lo que queremos.
Implementar una conexión hacia MySQL, PostegreSQL y Oracle DB.
Vamos a crear un archivo config.py que lea el archivo .ini creado mediante la función def config() que devolverá los parámetros de conexión en una variable «db»:
from configparser import ConfigParser
def config(filename='database.ini', section='postgresql'):
# create a parser
parser = ConfigParser()
# read config file
parser.read(filename)
# get section, default to postgresql
db = {}
if parser.has_section(section):
params = parser.items(section)
for param in params:
db[param[0]] = param[1]
else:
raise Exception('Section {0} not found in the {1} file'.format(section, filename))
return db
Importaremos esta función desde el archivo creado config.py en el código de Python que utilizaremos para conectarnos a la base de datos a través de psycopg2, en este caso a PostgreSQL, al que podremos llamar connect.py:
import psycopg2
from config import config
def connect():
""" Connect to the PostgreSQL database server """
conn = None
try:
# read connection parameters
params = config()
# connect to the PostgreSQL server
print('Connecting to the PostgreSQL database...')
conn = psycopg2.connect(**params)
# create a cursor
cur = conn.cursor()
# execute a statement
print('PostgreSQL database version:')
cur.execute('SELECT version()')
# display the PostgreSQL database server version
db_version = cur.fetchone()
print(db_version)
# close the communication with the PostgreSQL
cur.close()
except (Exception, psycopg2.DatabaseError) as error:
print(error)
finally:
if conn is not None:
conn.close()
print('Database connection closed.')
if __name__ == '__main__':
connect()
Al correr guardará los valores devueltos en db en la variable params la cual se utilizará para generar la conexión. El script nos devolverá el estado de conexión con éxito, la versión de PostgreSQL instalada y el sistema operativo sobre el cual corre.
A partir de aquí ya puedes realizar tus consultas SQL a través del cursor «cur».
Importante recordar que una vez realizadas las consultas requeridas debes cerrar el cursos y la conexión a la base de datos a través de .close() para ambos casos.
Si quieres conectar a una base de datos MySQL podrás utilizar los mismos archivos creados database.ini y connect.py, utilizando en este caso el conector mysql.connector el cual deberás instalar en tu equipo o servidor:
pip install mysql-connector
import mysql.connector
from config_mysql import config
def connect():
""" Connect to the MySQL database server """
conn = None
try:
# read connection parameters
params = config()
# connect to the MySQL server
print('Connecting to the MySQL database...')
conn = mysql.connector.connect(**params)
# create a cursor
cur = conn.cursor()
# execute a statement
print('MySQL database version:')
cur.execute('SELECT VERSION()')
# display the MySQL database server version
db_version = cur.fetchone()
print(db_version)
# close the communication with the MySQL
cur.close()
except (Exception, mysql.connector.Error) as error:
print(error)
finally:
if conn is not None:
conn.close()
print('Database connection closed.')
if __name__ == '__main__':
connect()
Finalmente si vas a conectarte a una base de datos de Oracle deberas instalar y utilizar el conector oracledb y hacer la importación en el script de Python:
pip install oracledb
En este caso te recomiendo seguir este tutorial de Oracle para conectar con sus bases de datos a través de Python.
OpenWeather es un equipo de expertos en TI y científicos de datos que practica la ciencia de datos meteorológicos profundos desde 2014. Para cada punto del mundo, OpenWeather proporciona datos meteorológicos históricos, actuales y pronosticados a través de API.
Entre los servicios que ofrecen pueden consumirse datos meteorológicos actuales y pronósticos:
Datos meteorológicos actuales.
Pronóstico por hora 4 días.
Pronóstico diario 16 días
Pronóstico Climático 30 días.
Alertas meteorológicas globales.
Notificaciones push.
Cómo llamar a las API de OpenWeather?
La clave API es todo lo que necesita para llamar a cualquiera de nuestras API meteorológicas. Una vez que se registre con su correo electrónico, se le enviará la clave API (APPID) en un correo electrónico de confirmación. Sus claves API siempre se pueden encontrar en la página de su cuenta , donde también puede generar claves API adicionales si es necesario.
Consulte nuestra página de documentación para encontrar toda la información técnica de cada producto. La documentación es una guía esencial con ejemplos reales y una descripción completa de las llamadas, respuestas y parámetros de la API.
Manejando datos con Python y PostgreSQL
Para consultar una API con Python y guardar el JSON devuelto en una base de datos PostgreSQL, se pueden seguir los siguientes pasos:
Importar las librerías necesarias: requests para hacer la petición a la API, psycopg2 para interactuar con la base de datos y json para manejar la respuesta en formato JSON.
import requests
import psycopg2
import json
Hacer la petición a la API y almacenar la respuesta en una variable. En este caso el código que te proveemos consulta las condiciones climatológicas de una ciudad en específico, en este caso Santiago de Chile.
Hacer la petición a la API y almacenar la respuesta en una variable.
Como recomendación, previo a escribir tu código puedes probar la consulta en tu explorador web. Asi verás en la pantalla el JSON con el cual vas a trabajar.
También podes utilizar la API de codificación geográfica (Geocoding API) que es una herramienta simple que facilita la búsqueda de ubicaciones mientras se trabaja con nombres y coordenadas geográficas.
Recuerda que en lugar de «{appKey}» debes agregar la api key que obtengas luego de registrarte en OpenWeather.
Crear un cursor para interactuar con la base de datos:
cur = conn.cursor()
Recorrer el JSON y hacer un insert en la base de datos por cada registro:
for registro in data: cur.execute(«INSERT INTO tabla (campo1, campo2, campo3) VALUES (%s, %s, %s)», (registro[‘campo1’], registro[‘campo2’], registro[‘campo3’]))
Cerrar el cursor y hacer commit para guardar los cambios:
cur.close()
conn.commit()
Cerrar la conexión a la base de datos.
conn.close()
En resumen, para consultar la API con Python y guardar el JSON devuelto en una base de datos PostgreSQL, se debe hacer la petición a la API y convertir la respuesta a formato JSON. Luego, se debe conectar a la base de datos, crear un cursor y recorrer el JSON haciendo un insert por cada registro. Finalmente, se deben cerrar el cursor y hacer commit para guardar los cambios, y cerrar la conexión a la base de datos.
Código completo
Para almacenar la información del ejemplo de JSON que hemos proporcionado, se podría crear una tabla llamada «clima» en PostgreSQL con las siguientes columnas y tipos de datos:
CREATE TABLE clima (
id SERIAL PRIMARY KEY,
lon FLOAT,
lat FLOAT,
temp FLOAT,
feels_like FLOAT,
temp_min FLOAT,
temp_max FLOAT,
pressure INT,
humidity INT,
speed FLOAT,
deg INT,
cloudiness INT
);
Aquí te dejo un ejemplo código en python para el mismo formato de respuesta, en donde debes sustituir el string de consulta a la api y las credenciales a la base de datos:
import requests
import psycopg2
import json
# Hacer la petición a la API
response = requests.get(''https://api.openweathermap.org/data/2.5/weather?q=Santiago,Chile&appid={appKey}&units=metric')
# Convertir la respuesta a formato JSON
data = json.loads(response.text)
# Conectar a la base de datos PostgreSQL
conn = psycopg2.connect(
host="localhost",
database="basedatos",
user="usuario",
password="contraseña"
)
# Crear un cursor para interactuar con la base de datos
cur = conn.cursor()
# Insertar los datos en la tabla correspondiente
cur.execute("INSERT INTO clima (lon, lat, temp, feels_like, temp_min, temp_max, pressure, humidity, speed, deg, cloudiness) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)",
(data['coord']['lon'], data['coord']['lat'], data['main']['temp'], data['main']['feels_like'], data['main']['temp_min'], data['main']['temp_max'], data['main']['pressure'], data['main']['humidity'], data['wind']['speed'], data['wind']['deg'], data['clouds']['all']))
# Cerrar el cursor y hacer commit para guardar los cambios
cur.close()
conn.commit()
# Cerrar la conexión a la base de datos
conn.close()
En este ejemplo, se están insertando los valores de «lon», «lat», «temp», «feels_like», «temp_min», «temp_max», «pressure», «humidity», «speed», «deg» y «all» en una tabla llamada «clima» en la base de datos PostgreSQL. Es importante asegurarse de que los nombres de las columnas en la tabla y los nombres de las claves en el JSON coincidan.
Verificación
Vamos a correr todo el código entregado para verificar su funcionamiento. Así que entramos a PostgreSQL en la línea de comando (psql) y creamos una base de datos. Puedes utilizar el nombre que quieras, pero debes asegurante que coincida con las credenciales que agreges a Python:
Creamos la tabla clima:
Una vez que hemos agregado la api key de OpenWeather y las credenciales de postgres corremos nuestro programa de python. Sin no hay errores de sintaxis o excepciones concurrentes, ya habremos consultado la api y guardado los datos en la tabla clima.
Hacemos la respectiva consulta SQL:
SELECT * FROM clima;
Asi obtenemos la informaciòn climática debidamente registrada en nuestra base de datos.
A partir de acá ya puede crear un programa que consulte información diversificada, como la correspondiente a varias ciudades de un mismo país o ciudades capitales de diversos paises, agrupándolas en una lista o diccionario para consultarse en un bucle.
Incluso, aunque esta información también puedes consultarla a la api, es sencillo llevar un registro diario de consultas mediante una herramienta de automatización como Github Actions o Apache Airflow (en un servidor web) que ejecute tu programa cada determinado tiempo, como cada 24 horas. De esta forma podrías realizar análisis de líneas de tiempo y hasta tu propio pronóstico climático utilizando alguna libreria de Inteligencia Artificial.
Ansible es una plataforma de software libre para configurar y administrar ordenadores. Combina instalación multi-nodo, ejecuciones de tareas ad hoc y administración de configuraciones. Adicionalmente, Ansible es categorizado como la herramienta de orquestación mas utilizada al dia de hoy.
Para su instalación, que no es complicada, y su configuración, se deben seguir los lineamientos de la documentación según sea la distro sobre la cual se ha instalado.
Para realizar una instalación en Ubuntu se pueden utilizar los siguientes comandos:
Luego de su descarga y su instalaciónm Ansible se ubica en el directorio /etc/ansible donde encontrarás el archivo de configuración ansible.cfg el cual albergará los plugins que instales con posterioridad, y el archivo hosts define los hosts y grupos de hosts en los que funcionan los comandos, módulos y tareas de un manual. Para comprender más sencillamente los hosts hacen referencia a los dominios y direcciones IP de tus servidores. Incluso a modo de prueba puedes agregar tu equipo como localhost para agregarlo a las configuraciones automatizadas.
De previo a agregar un servidor al archivo hosts es recomendable que tengas autorizado el acceso al servidor que vayas a agregar como hosts mediante ssh-keygen. En todo caso, también puedes configurar el acceso a tu servidor mediante la definición de ansible_user y ansible_password en dicho archivo, aunque no es lo mas recomendable.
Un ejemplo de configuración del archivo hosts puede contener una dirección IP o un dominio, ambos referidos al servidor que se va a automatizar, o bien ambos., como el siguiente:
[webservers]
107.175.219.151
localhost
Si no has configurado las claves ssh puedes agregar las credenciales así:
Esta configuración incluye tanto acciones sobre un servidor que se accesa mediante la dirección IP 107.175.219.151 y tu propio equipo, pero puedes agregar mas direciones IP o dominios que apunten a otros servidores.
Ahora intentaremos conectar a los hosts con el comando ping, verificar que haya un python utilizable y esperar el regreso de pong en caso de éxito.
Si tenemos una respuesta satisfactoria leeremos success y la leyenda en verde, en caso contrario que exista algún problema de configuración, credenciales o conexión nos dará el aviso de fallo con la leyenda en rojo.
Comandos ad hoc
Un comando ad hoc de Ansible utiliza la herramienta de línea de comandos /usr/bin/ansible para automatizar una sola tarea en uno o más nodos administrados. los comandos ad hoc son rápidos y fáciles, pero no son reutilizables. Su importancia radica en que se utilizarán o transferirán directamente a los archivos playbook que los verdaderos protagnistas de Ansible, y que los veremos de seguido.
De rigor es importante remitirse a la documentación, para comprender su uso, que siguie esta regla:
$ ansible [pattern] -m [module] -a "[module options]"
El siguiente ejemplo verifica que el editor vim este instalado en su equipo y de no estarlo procede a su descarga y configuración.
Es importante notar que una vez que se ha cumplido con la instalación, en el siguiente llamado del módulo simplemente indicará que ya se ha cumplido con este proceso.
Aquí es donde entra la automatización e inicia la utilidad de Ansible pues puedes definir muchas tareas como:
Para esto es donde ocupamos los archivos playbook cuya extensión es .yml y se crean en el mismo directorio /etc/ansible.
Esta página proporciona una descripción general básica de la sintaxis YAML correcta, que es cómo se expresan los playbooks de Ansible (el lenguaje de gestión de configuración).
Se utiliza YAML porque es más fácil de leer y escribir para los humanos que otros formatos de datos comunes como XML o JSON. Además, hay bibliotecas disponibles en la mayoría de los lenguajes de programación para trabajar con YAML.
Un ejemplo sencillo que utiliza los hosts que hemos defindo como ejemplo anteriormente puede ser:
Este archivo define el grupo webservers (localhost y remoto) como el destino del script, define dos tareas a realizar que es la actualización del caché de paquetes y la instalación de la libreria nmap en ambos servidores a través del módulo apt.
Cómo el módulo apt requiere permisos de superusuario administrador eventualmente se debe agregar become: true al script y el parámetro -K para que se nos solicite la respectiva contraseña en caso que el acceso SSH no sea con el administrador. En caso contrario no habrà ningun problema en correr el script tal y como se ha definido.
Finalmente, en este repositorio encontrarás mas ejemplos de playbooks sencillos con los cuales puedes iniciar tus configuraciones de servidores con Ansible.
Primero, necesitamos instalar las librerías. Puedes hacer esto utilizando pip en la terminal con los siguientes comandos:
pip install pdfplumber
pip install translate
Luego el código es muy sucinto. Cada instrucción cuenta con una descripción comentada de lo que realiza en el programa. Básicamente hay que tener el archivo PDF en el mismo directorio donde se corre este script de Python, y allí mismo se escribe un nuevo archivo con la traducción.
Estas rutas son también modificables a gusto o conveniencia del usuario o sistema en particular.
import os
import pdfplumber
from translate import Translator
# Ruta del archivo PDF
pdf_file = "doc_to_translate.pdf"
# Crear objeto Translator
translator = Translator(to_lang="es")
# Crear nombre de archivo para el archivo de salida
output_file = os.path.splitext(pdf_file)[0] + "_traducido.txt"
# Crear archivo de salida para escritura
try:
with open(output_file, 'w', encoding='utf-8') as output:
# Abrir el archivo PDF
with pdfplumber.open(pdf_file) as pdf:
# Iterar por cada página del archivo PDF
for page in pdf.pages:
# Obtener el contenido de la página y dividirlo en fragmentos de 500 caracteres
text = page.extract_text()
if text:
fragments = [text[i:i+500] for i in range(0, len(text), 500)]
# Traducir cada fragmento y escribirlo en el archivo de salida
for fragment in fragments:
translation = translator.translate(fragment)
output.write(translation + "\n")
print("Traducción completada y guardada en el archivo:", output_file)
except Exception as e:
print("No se pudo realizar la traducción. Error:", e)
En este código, estamos utilizando la biblioteca pdfplumberpara leer el archivo PDF (bien podría ser PyPDF2también). Además, estamos manejando los errores de lectura y escritura del archivo mediante la utilización de try y except blocks. Si hay algún error al leer o escribir el archivo, se mostrará un mensaje de error en lugar de simplemente fallar en silencio.
Translate es una herramienta de traducción simple pero poderosa escrita en python con soporte para múltiples proveedores de traducción. Ofrece integración con la API de traducción de Microsoft, la API de MyMemory traducida, LibreTranslate y las API gratuitas y profesionales de DeepL.
La principal razón para usar translate es hacer traducciones de una manera simple sin la necesidad de un mayor esfuerzo y puede usarse como una herramienta de traducción como línea de comando.
Translate posee una cli muy útil y sencilla de usar con la cual puede configurar los parámetros de traducción, definir el motor de traducción(MyMemory por defecto) o agregar una api-key para su uso. Escribes el siguiente comando y sigues las instrucciones.
translate-cli --generate-config-file
La biblioteca translateutiliza una API gratuita llamada MyMemory para realizar las traducciones, y hay un límite en el número de traducciones que se pueden hacer de forma gratuita en un día determinado. Este límite puede variar dependiendo de la disponibilidad del servicio.
Para evitar este problema, puedes intentar lo siguiente:
Esperar hasta que se restablezcan las traducciones gratuitas. La biblioteca translatesuele mostrar una hora aproximada de cuándo estará disponible la siguiente traducción gratuita.
Utilizar un servicio de traducción de pago que no tenga límites en el número de traducciones que se pueden realizar. Hay varias opciones disponibles en línea, como Google Cloud Translation, Amazon Translate, etc. Deberás registrarte y seguir los pasos necesarios para obtener acceso a la API y las credenciales de autenticación.
Utilizar otra biblioteca de traducción que utilice una API diferente y no tenga límites en el número de traducciones gratuitas. Hay varias opciones disponibles en línea, como TextBlob, DeepL, etc. Sin embargo, es posible que tengas que ajustar el código para utilizar la API de la biblioteca que elijas.
Es un algoritmo de reducción criptográfico de 128 bits ampliamente usado. Uno de sus usos es el de comprobar que algún archivo no haya sido modificado.
La función PostgreSQL MD5()calcula el hash MD5 de una cadena y devuelve el resultado en hexadecimal. Utilizar el hash MD5 para almacenar contraseñas no es lo más seguro, pero es importante conocerlo pues es el se ha utilizado en forma tradicional por un par de décadas o más.
A continuación veamos la sintaxis de la MD5()función:
MD5(string)
Para crear una tabla en PostgreSQL que almacene información de usuario con el password codificado con MD5, puedes seguir los siguientes pasos:
Abre una conexión con tu base de datos PostgreSQL utilizando una herramienta como pgAdmin o la línea de comandos de PostgreSQL.
Crea una nueva tabla utilizando el comando CREATE TABLE, especificando los nombres de las columnas y sus tipos de datos.
Por ejemplo:
CREATE TABLE usuarios (
id SERIAL PRIMARY KEY,
nombre VARCHAR(50),
email VARCHAR(50),
password VARCHAR(32)
);
En este ejemplo, estamos creando una tabla llamada «usuarios» con cuatro columnas: id (un número de serie generado automáticamente), nombre, email y password.
Para almacenar el password codificado con MD5, debes utilizar una función de PostgreSQL llamada «md5». Esta función toma una cadena de texto como argumento y devuelve su hash MD5 en formato de texto. Puedes utilizar esta función en una instrucción INSERT para almacenar el password codificado en la tabla.
El ejemplo para esto:
INSERT INTO usuarios (nombre, email, password) VALUES ('Juan', 'juan@example.com', md5('contraseña123'));
En este ejemplo, estamos insertando un nuevo usuario en la tabla «usuarios» con el nombre «Juan», el email «juan@example.com» y el password «contraseña123» codificado con MD5.
Cuando quieras verificar si un usuario ha ingresado la contraseña correcta, debes comparar el hash MD5 del password ingresado con el hash almacenado en la base de datos. Puedes hacer esto utilizando la función md5 nuevamente en la consulta SELECT.
SELECT * FROM usuarios WHERE email='juan@example.com' AND password=md5('contraseña123');
En este ejemplo, estamos seleccionando todos los usuarios que tienen el email «juan@example.com» y el password «contraseña123» codificado con MD5.
Recuerda que utilizar el hash MD5 para almacenar contraseñas no es lo más seguro. Siempre es mejor utilizar algoritmos más seguros y modernos como bcrypt o scrypt.
Cómo hacer el mismo procedimiento con sha256?
Para almacenar contraseñas codificadas con SHA256 en una tabla de PostgreSQL, puedes seguir los mismos pasos para crear la tabla que contendrá la información:
Abre una conexión con tu base de datos PostgreSQL utilizando una herramienta como pgAdmin o la línea de comandos de PostgreSQL.
Crea una nueva tabla utilizando el comando CREATE TABLE, especificando los nombres de las columnas y sus tipos de datos.
CREATE TABLE usuarios (
id SERIAL PRIMARY KEY,
nombre VARCHAR(50),
email VARCHAR(50),
password VARCHAR(64)
);
Para almacenar el password codificado con SHA256, debes utilizar la función de PostgreSQL llamada «encode». Esta función toma dos argumentos: el primero es el resultado de la función hash, en este caso, la función «sha256», y el segundo es el formato de salida que queremos, en este caso, ‘hex’.
En este ejemplo, estamos insertando un nuevo usuario en la tabla «usuarios» con el nombre «Juan», el email «juan@example.com» y el password «contraseña123» codificado con SHA256.
Cuando quieras verificar si un usuario ha ingresado la contraseña correcta, debes comparar el hash SHA256 del password ingresado con el hash almacenado en la base de datos. Puedes hacer esto utilizando la función digest y encode nuevamente en la consulta SELECT.
SELECT * FROM usuarios WHERE email='juan@example.com' AND password=encode(digest('contraseña123', 'sha256'), 'hex');
En este ejemplo, estamos seleccionando todos los usuarios que tienen el email «juan@example.com» y el password «contraseña123» codificado con SHA256.
Recuerda que SHA256 es un algoritmo de hash más seguro que MD5, pero todavía se recomienda utilizar técnicas adicionales como agregar una «sal» aleatoria a la contraseña y utilizar un algoritmo de hash más seguro y moderno como bcrypt o scrypt.
Es posible que PostgreSQL te devuelva un mensaje como el siguiente: «SQL Error [42883]: ERROR: function digest(unknown, unknown) does not exist». Esto no quiere decir que la consulta sea incorrecta, sino que debes habilitar el módulo «pgcrypto«.
Modulos adicionales: pgcrypto.
El módulo pgcryptoproporciona funciones criptográficas para PostgreSQL .
Este módulo se considera » de confianza » , es decir, puede ser instalado por personas que no sean superusuarios y que tengan privilegios CREATE sobre la base de datos actual.
Para instalar el módulo «pgcrypto», puedes utilizar el siguiente comando SQL en la línea de comandos de PostgreSQL:
CREATE EXTENSION pgcrypto;
Este comando creará el módulo «pgcrypto» en la base de datos actual.
Una vez instalado el módulo «pgcrypto», deberías ser capaz de utilizar la función «digest» sin errores.
El comando SED en UNIX significa editor de flujo y puede realizar muchas funciones en el archivo, como buscar, encontrar y reemplazar, insertar o eliminar. Aunque el uso más común del comando SED en UNIX es para sustitución o para buscar y reemplazar. Al usar SED, puede editar archivos incluso sin abrirlos, que es una forma mucho más rápida de encontrar y reemplazar algo en el archivo, que primero abrir ese archivo en VI Editor y luego cambiarlo.
SED es un potente editor de secuencias de texto. Puede hacer inserción, eliminación, búsqueda y reemplazo (sustitución).
El comando SED en Unix admite la expresión regular, lo que le permite realizar coincidencias de patrones complejos.
Sintaxis
OPCIONES sed... [GUIÓN] [ARCHIVO DE ENTRADA...]
Ejemplo: considere el siguiente archivo de texto como una entrada.
$cat > file.txt
Unix es un gran sistema operativo. Unix es de código abierto. Unix es un sistema operativo libre.
aprender sistema operativo.
unix linux cuál eliges.
unix es fácil de aprender.unix es un sistema operativo multiusuario.Aprender unix .unix es un poderoso.
Reemplazar o sustituir una cadena: el comando Sed se usa principalmente para reemplazar el texto en un archivo. El siguiente comando sed simple reemplaza la palabra «unix» con «linux» en el archivo.
$sed 's/unix/linux/' file.txt
linux es un gran sistema operativo. Unix es de código abierto. Unix es un sistema operativo libre.
aprender sistema operativo.
linux linux cuál eliges.
linux es fácil de aprender.unix es un sistema operativo multiusuario.Aprender unix .unix es poderoso.
Aquí la “s” especifica la operación de sustitución. Los “/” son delimitadores. El "unix" es el patrón de búsqueda y el "linux" es la cadena de reemplazo.
De forma predeterminada, el comando sed reemplaza la primera ocurrencia del patrón en cada línea y no reemplazará la segunda, tercera... ocurrencia en la línea.
Reemplazo de la enésima ocurrencia de un patrón en una línea: Use las banderas /1, /2, etc. para reemplazar la primera, segunda ocurrencia de un patrón en una línea. El siguiente comando reemplaza la segunda aparición de la palabra «unix» con «linux» en una línea.
$sed 's/unix/linux/2' file.txt
Unix es un gran sistema operativo. Linux es de código abierto. Unix es un sistema operativo libre.
aprender sistema operativo.
unix linux cuál eliges.
Unix es fácil de aprender. Linux es un sistema operativo multiusuario. Aprenda Unix. Unix es un poderoso.
Reemplazo de todas las ocurrencias del patrón en una línea: el indicador de sustitución /g (reemplazo global) especifica el comando sed para reemplazar todas las ocurrencias de la cadena en la línea.
$sed 's/unix/linux/g' file.txt
linux es un gran sistema operativo. Linux es de código abierto. linux es un sistema operativo libre.
aprender sistema operativo.
linux linux cuál eliges.
linux es fácil de aprender. linux es un sistema operativo multiusuario. Aprenda linux. linux es un poderoso.
Reemplazar desde la enésima aparición a todas las apariciones en una línea: use la combinación de /1, /2, etc. y /g para reemplazar todos los patrones desde la enésima aparición de un patrón en una línea. El siguiente comando sed reemplaza la tercera, cuarta, quinta… palabra «unix» con la palabra «linux» en una línea.
$sed 's/unix/linux/3g' file.txt
Unix es un gran sistema operativo. Unix es de código abierto. linux es un sistema operativo libre.
aprender sistema operativo.
unix linux cuál eliges.
unix es fácil de aprender.unix es un sistema operativo multiusuario.Aprender linux .linux es un poderoso.
Como vemos, el comando Sed es muy útil para realizar operaciones de búsqueda y reemplazo de patrones de texto.
Expresiones Regulares (RE)
Veamos ahora un ejemplo de cómo utilizar Espresiones Regulares con el comando Sed.
Colocar entre paréntesis el primer carácter de cada palabra: este ejemplo de sed imprime el primer carácter de cada palabra entre paréntesis.
$ echo "Bienvenido al mundo de Linux" | sed 's/\b\([a-zA-Z]\)/(\1)/g'
La expresión regular ‘s/\b([a-zA-Z])/(\1)/g’ se puede interpretar de la siguiente manera:
La letra ‘s’ al principio indica que se trata de una operación de reemplazo (substitución).
El primer conjunto de caracteres dentro de las barras inclinadas (‘/’) representa el patrón de búsqueda a ser reemplazado. En este caso, el patrón de búsqueda es ‘\b\([a-zA-Z]\)’, que busca un carácter de palabra que sea una letra mayúscula o mayúscula al inicio de una palabra.
El segundo conjunto de caracteres dentro de las barras inclinadas (‘/’) representa el texto de reemplazo. En este caso, el texto de reemplazo es ‘(\1)’, que reemplaza el patrón de búsqueda con la misma letra mayúscula que se encontró, pero esta vez entre paréntesis.
La letra ‘g’ al final indica que se debe realizar la operación de reemplazo en todas las instancias encontradas en el texto, no sólo en la primera.
Entonces, esta expresión regular busca todas las letras mayúsculas que comienzan una palabra y las reemplaza por la misma letra entre paréntesis.
Con el comando Sed puedes realizar un gran número de modificaciones y sustituciones de texto, incluso también se puede usar para eliminar líneas de un archivo en particular.
Para que conozcas más sobre la sintaxis de este comando y su uso con expresiones regulares tanto básicas (BRE) como extendidas (ERE) te recomendamos que visites la documentación de GNU al respecto.
En este ejercicio leeremos una biblioteca de iTunes en valores separados por comas (CSV) y produciremos tablas correctamente normalizadas como se especifica a continuación.
iTunes
Haremos algunas cosas de manera diferente en esta tarea. No usaremos una tabla «en bruto» separada, solo usaremos declaraciones ALTER TABLE para eliminar columnas después de que no las necesitemos (es decir, las convertimos en claves foráneas).
Utilizaremos este CSV que contiene la información de las pistas musicales. No usaremos una tabla «en bruto» separada, solo usaremos declaraciones ALTER TABLE para eliminar columnas después de que no las necesitemos (es decir, las convertimos en claves foráneas).
Esta vez construiremos una relación de muchos a muchos usando una tabla de junction/through/join entre pistas y artistas.
El script para construir las tablas que vamos a utilizar:
CREATE TABLE album (
id SERIAL,
title VARCHAR(128) UNIQUE,
PRIMARY KEY(id)
);
CREATE TABLE track (
id SERIAL,
title TEXT,
artist TEXT,
album TEXT,
album_id INTEGER REFERENCES album(id) ON DELETE CASCADE,
count INTEGER,
rating INTEGER,
len INTEGER,
PRIMARY KEY(id)
);
CREATE TABLE artist (
id SERIAL,
name VARCHAR(128) UNIQUE,
PRIMARY KEY(id)
);
CREATE TABLE tracktoartist (
id SERIAL,
track VARCHAR(128),
track_id INTEGER REFERENCES track(id) ON DELETE CASCADE,
artist VARCHAR(128),
artist_id INTEGER REFERENCES artist(id) ON DELETE CASCADE,
Luego procedemos a copiar los datos contenidos en el CSV a la tabla track (recuerda ingresar a la línea de comandos con la instrucción psql):
\copy track(title,artist,album,count,rating,len) FROM 'library.csv' WITH DELIMITER ',' CSV;
Seguidamente actualizamos las tablas album y artist con los datos únicos (SELECT DISTINCT) de los campos album y artists de la tabla track. De igual forma los campos track y artist de la tabla tracktoartist desde los campos title y artist de la tabla track.
INSERT INTO album (title) SELECT DISTINCT album FROM track;
INSERT INTO artist (name) SELECT DISTINCT artist FROM track;
UPDATE track SET album_id = (SELECT album.id FROM album WHERE album.title = track.album);
INSERT INTO tracktoartist (track, artist) SELECT DISTINCT title, artist FROM track;
Una vez hecho esto actualizamos los campos track_id y artist_id de la tabla tracktoartist con los respectivos «id’s» de las tablas track y artist.
UPDATE tracktoartist SET track_id = (SELECT track.id FROM track WHERE track.title = tracktoartist.tracK);
UPDATE tracktoartist SET artist_id = (SELECT artist.id FROM artist WHERE artist.name = tracktoartist.artist);
De esta forma habremos normalizado esta información de Pistas Musicales creando las respectivas relaciones de modo que ahora podemos ejecutar una consulkat como la siguiente:
SELECT track.title, album.title, artist.name
FROM track
JOIN album ON track.album_id = album.id
JOIN tracktoartist ON track.id = tracktoartist.track_id
JOIN artist ON tracktoartist.artist_id = artist.id
LIMIT 3;
Obtendremos un resultado como el siguiente:
Para finalizar podemos eliminar los datos que nos sobran, las columnas album y artist de la tabla track y los campos track y artist de la tabla tracktoartist, a traves de la instrucción ALTER TABLE … DROP COLUMN.
En esta entrega leeremos algunos datos del Patrimonio de la Humanidad de la Unesco en formato de valores separados por comas (CSV), los cargaremos en una base de datos PostgreSQL mediante el comando COPY y crearemos tablas correctamente normalizadas.
Un sitio del Patrimonio Mundial es un hito o área protegida legalmente por una convención internacional administrada por la Organización de las Naciones Unidas para la Educación, la Ciencia y la Cultura (UNESCO). Los sitios del Patrimonio Mundial son designados por la UNESCO por tener importancia cultural, histórica, científica o de otro tipo. Se considera que los sitios contienen «patrimonio cultural y natural en todo el mundo considerado de valor excepcional para la humanidad».
Para ser seleccionado, un Sitio del Patrimonio Mundial debe ser un hito único que sea identificable geográfica e históricamente y que tenga un significado cultural o físico especial. Por ejemplo, los sitios del Patrimonio Mundial pueden ser ruinas antiguas o estructuras históricas, edificios, ciudades,[a] desiertos, bosques, islas, lagos, monumentos, montañas o áreas silvestres. Un Sitio del Patrimonio Mundial puede significar un logro notable de la humanidad y servir como evidencia de nuestra historia intelectual en el planeta, o puede ser un lugar de gran belleza natural.
El dataset puede descargarse en desde el siguiente link: Unesco Heritage Sites dataset. Los datos corresponden al año 2018. Sin embargo si desea contar con datos más actualizados puede descargarlos desde los siguientes sitios (dataset 2021 a la fecha de hoy):
Una vez descargado el dataset procedemos a crear las tablas parea la carga de datos. Puedes nombrar la base de datos como gustes y los nombre de las tablas también puedes modificarlos, aunque esta nomenclatura permite una mejor comprensión de su contenido.
DROP TABLE unesco_raw;
CREATE TABLE unesco_raw (
name TEXT,
description TEXT,
justification TEXT,
year INTEGER,
longitude FLOAT,
latitude FLOAT,
area_hectares FLOAT,
category TEXT,
category_id INTEGER,
state TEXT,
state_id INTEGER,
region TEXT,
region_id INTEGER,
iso TEXT,
iso_id INTEGER
);
Para cargar los datos CSV para esta asignación, use el siguiente comando COPY desde la lonea de comando de PpostgreSQL (psql) . Agregar HEADER hace que el cargador CSV omita la primera línea en el archivo CSV. El comando \copy debe ser una línea larga.
\copy unesco_raw(nombre,descripción,justificación,año,longitud,latitud,área_hectáreas,categoría,estado,región,iso) FROM 'whc-sites-2018-small.csv' WITH DELIMITER ',' CSV HEADER;
Revisamos los datos.
Consulta SQL en DBeaver
Ahora procedemos a normalizar los datos con la ayuda de tablas adicionales que podemos llamar «look up tables».
La normalización es el proceso de seguir una serie de reglas (formas normales), para asegurar que nuestras relaciones estén ordenadas y regularizadas con el fin de mejorar dichas relaciones. Están enfocadas en evitar la redundancia de datos e inconsistencias en el diseño de nuestras tablas.
Lo primero que determinamos es que existe redundancia de datos en campos como «categoría» donde encontramos «Sitio cultural», «Sitio natural » y «Sitio mixto». Estos datos los podemos trasladar a otra tabla y crear una relación con la tabla «unesco_raw» para eliminar esta réplica de datos.
Caso similar podemos apreciar en los campos «state», «region» e «iso».
Entonces procedemos a crear tablas para estos datos que contendrán los datos respectivos de «category», «state», «region» e «iso» de forma única (campos UNIQUE) con su respentido identificados (id SERIAL).
CREATE TABLE category (
id SERIAL,
name VARCHAR(128) UNIQUE,
PRIMARY KEY(id)
);
CREATE TABLE state (
id SERIAL,
name VARCHAR(128) UNIQUE,
PRIMARY KEY(id)
);
CREATE TABLE region (
id SERIAL,
name VARCHAR(128) UNIQUE,
PRIMARY KEY(id)
);
CREATE TABLE iso (
id SERIAL,
name VARCHAR(128) UNIQUE,
PRIMARY KEY(id)
);
Cargamos los datos de «unesco_raw» a las tablas que hemos creado, seleccionando los valores únicos (SELECT DISTINCT).
INSERT INTO category(name) SELECT DISTINCT category FROM
unesco_raw;
INSERT INTO state(name) SELECT DISTINCT state FROM unesco_raw;
INSERT INTO region(name) SELECT DISTINCT region FROM
unesco_raw;
INSERT INTO iso(name) SELECT DISTINCT iso FROM unesco_raw;
Ahora actualizamos la tabla «unesco_raw» con los datos de las tablas que hemos creado, agregarndo la categoría de sitio por su identificador (id) para crear la relación. En este caso utilizaremos una consulta compuesta para obtener primero el identificador de categoría de la tabla «category» para luego actualizar el campo «category_id» en «unesco_raw».
Igual procedemos con los datos de las tablas «state», «regiosn» e «iso».
UPDATE unesco_raw SET category_id = (
SELECT category.id FROM category WHERE category.name = unesco_raw.category);
UPDATE unesco_raw SET state_id = (
SELECT state.id FROM state WHERE state.name = unesco_raw.state );
UPDATE unesco_raw SET region_id = (
SELECT region.id FROM region WHERE region.name = unesco_raw.region);
UPDATE unesco_raw SET iso_id = (
SELECT iso.id FROM iso WHERE iso.name = unesco_raw.iso);
De esta forma ya contamos con los identificadores para las categoría, los estados, las regiones y las nomenclaturas ISO.
Consulta SQL en DBeaver
Para poder descartar la información redundante procedemos a crear una tabla final, definitiva que llamaremos simplemente «unesco» de la siguiente forma:
CREATE TABLE unesco (
name TEXT,
description TEXT,
justification TEXT,
year INTEGER,
longitude FLOAT,
latitude FLOAT,
area_hectares FLOAT,
category_id INTEGER,
state_id INTEGER,
region_id INTEGER,
iso_id INTEGER
);
Copiamos toda la información exceptuando los datos de las columnas categoría, los estados, las regiones y las nomenclaturas ISO, e incluyendo los identificadores de las demás tablas creadas para establecer las respectivas relaciones.
De esta forma obtendremos la información del dataset World Heritage List de una forma mejor estructurada, sin redundancia de datos, aprovechando las ventajas que nos ofrece una base de datos relacional como PostgreSQL.
Ahpora podemos eliminar la tabla «unesco_raw» usando DROP TABLE, y revisar la información obtenida con una consulta como la siguiente:
SELECT unesco.name, year, category.name, state.name, region.name, iso.name
FROM unesco
JOIN category ON unesco.category_id = category.id
JOIN iso ON unesco.iso_id = iso.id
JOIN state ON unesco.state_id = state.id
JOIN region ON unesco.region_id = region.id
ORDER BY state.name, unesco.name
LIMIT 3;
El resultado sería el siguiente:
Consulta SQL en DBeaver
En una siguiente entrega utilizaremos estos datos almacenados en PostgreSQL para general un mapa interactivo con geolocalización de cada sitio de la Unesco.
El lenguaje de procedimientos PL/pgSQL agrega muchos elementos de procedimientos, por ejemplo, estructuras de control, bucles y cálculos complejos, para ampliar el SQL estándar. Le permite desarrollar funciones complejas y procedimientos almacenados en PostgreSQL que pueden no ser posibles usando SQL simple.
El lenguaje de procedimiento PL/pgSQL es similar a Oracle PL/SQL . Las siguientes son algunas de las razones para aprender PL/pgSQL:
PL/pgSQL es fácil de aprender y fácil de usar.
PL/pgSQL viene con PostgreSQL por defecto. Las funciones definidas por el usuario y los procedimientos almacenados desarrollados en PL/pgSQL se pueden utilizar como cualquier función integrada y procedimiento almacenado.
PL/pgSQL hereda todos los tipos, funciones y operadores definidos por el usuario.
PL/pgSQL tiene muchas características que le permiten desarrollar funciones complejas y procedimientos almacenados.
PL/pgSQL se puede definir para que el servidor de base de datos de PostgreSQL confíe en él.
Las funciones creadas con PL/pgSQL se pueden usar en cualquier lugar donde se puedan usar las funciones integradas. Por ejemplo, es posible crear funciones de cálculo condicional complejas y luego usarlas para definir operadores o usarlas en expresiones de índice.
En PostgreSQL 9.0 y versiones posteriores, PL/pgSQL está instalado de forma predeterminada. Sin embargo, sigue siendo un módulo cargable, por lo que los administradores especialmente conscientes de la seguridad podrían optar por eliminarlo.
Cómo crear un campo updated_at que automaticamente registre la fecha cuando el registro se modifica con PostgreSQL?
Función para actualizar campo de fecha «updated_at»
Para crear un campo updated_at que se actualice automáticamente cuando se modifica un registro por ejemplo en una base de datos MySQL, puedes utilizar la función CURRENT_TIMESTAMP junto con el atributo ON UPDATE.
Aquí está el código para crear una tabla con un campo updated_at:
CREATE TABLE ejemplo (
id INT PRIMARY KEY,
nombre VARCHAR(50),
descripcion VARCHAR(255),
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
En este ejemplo, el campo updated_at se establece con un valor predeterminado de la fecha y hora actual utilizando la función CURRENT_TIMESTAMP, y también se agrega el atributo ON UPDATE CURRENT_TIMESTAMP, lo que significa que se actualizará automáticamente con la fecha y hora actual cada vez que se modifique el registro.
Sin embargo, para crear un campo updated_at que se actualice automáticamente cuando se modifica un registro en PostgreSQL, se debe utilizar una función llamada trigger.
Aquí está el código para crear una tabla con un campo updated_at:
CREATE TABLE ejemplo (
id SERIAL PRIMARY KEY,
nombre VARCHAR(50),
descripcion VARCHAR(255),
updated_at TIMESTAMP
);
En este ejemplo, el campo updated_at se deja sin valor predeterminado ya que será actualizado automáticamente a través de la función trigger.
A continuación, puedes crear una función trigger que se active cada vez que se modifique un registro en la tabla ejemplo, y actualizará automáticamente el valor del campo updated_at con la fecha y hora actual.
CREATE OR REPLACE FUNCTION actualizar_updated_at()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = NOW();
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
Esta función trigger utiliza la función NOW() para obtener la fecha y hora actuales y actualizar el campo updated_at del registro modificado.
Por último, puedes crear el trigger que se activará cada vez que se realice una operación UPDATE en la tabla ejemplo, y ejecutará la función trigger actualizar_updated_at().
CREATE TRIGGER trigger_actualizar_updated_at
BEFORE UPDATE ON ejemplo
FOR EACH ROW
EXECUTE FUNCTION actualizar_updated_at();
Este trigger se activará antes de que se actualice cualquier registro en la tabla ejemplo, y ejecutará la función trigger actualizar_updated_at(), que actualizará el campo updated_at con la fecha y hora actuales.
Con estos pasos, el campo updated_at se actualizará automáticamente cada vez que se modifique un registro en la tabla ejemplo. Puedes ajustar los nombres de la tabla y los campos para que se adapten a tus necesidades específicas.