Conectar Superset a una base de datos¶
Ejercicio superset-first-connection-annex.pdf · PDF
La primera vez que juegas a un juego en línea, te pregunta cosas antes de dejarte entrar. ¿Qué servidor? ¿Qué mundo? ¿Tu cuenta? ¿Tu contraseña? Si te equivocas en una, te quedas en el vestíbulo mirando un mensaje de error.
Una base de datos hace exactamente lo mismo. En la última página viste que, de los seis tipos de fuente de datos, la base de datos relacional es la que más pide antes de abrirse. Hoy aprendes qué pide, por qué y cómo leer el error cuando la puerta sigue cerrada.
Después cruzas esa puerta: metes un conjunto de datos real en la base de datos y le haces tu primera pregunta.
Qué aprenderás
- Nombrar las cinco cosas que necesita una conexión a una base de datos, más el driver, y decir para qué sirve cada una
- Leer una cadena de conexión y encontrar cada una de esas partes dentro de ella
- Saber por un mensaje de error qué ajuste está mal
- Cargar un archivo CSV en una base de datos desde Superset
- Ejecutar tus primeras consultas en SQL Lab
- Evitar la trampa: pensar que Superset guarda tus datos o que
localhostsiempre significa "mi ordenador"
Superset no guarda tus datos¶
Empieza por la imagen, porque todo lo demás cuelga de ella.
flowchart LR
B["<b>Tu navegador</b><br>lo que ves y pulsas"] -- "página web" --> S["<b>Superset</b><br>(el cliente del juego)<br>conecta, pregunta, dibuja"]
S -- "SQL, a través<br>del driver" --> D[("<b>PostgreSQL</b><br>(el servidor del juego)<br>donde viven las filas")]
D -- "filas" --> S
Aquí hay tres jugadores, y son tres programas distintos:
| Programa | En el juego | Qué hace | Qué guarda |
|---|---|---|---|
| Tu navegador | La pantalla | Muestra las páginas de Superset | Nada |
| Superset | El cliente del juego | Se conecta a la base de datos, envía preguntas, dibuja las respuestas | Sus propios ajustes: usuarios, conexiones guardadas, gráficos. No tus filas. |
| PostgreSQL | El servidor del juego | Guarda las tablas y responde preguntas sobre ellas | Tus datos |
Un servidor de base de datos es un programa que guarda datos en tablas y responde preguntas sobre ellas a cualquier programa que se conecte con los datos correctos. PostgreSQL es el que usamos.
Una conexión es el conjunto de datos que necesita un programa para llegar a un servidor de base de datos y que lo dejen entrar.
Superset es un cliente. Un cliente de juego sin servidor al que unirse te enseña un menú bonito y nada más. Por eso la primera tarea en Superset es siempre la misma: decirle dónde está el servidor.
Cuidado: \"Superset guarda mis datos\"
No. Superset guarda conexiones y gráficos. Las filas están en PostgreSQL. Si Superset desapareciera mañana, tus tablas seguirían ahí y cualquier otra herramienta con los datos de conexión correctos podría leerlas. Lo verás tú mismo al final de esta unidad, con Power BI.
Cinco cosas y un traductor¶
Toda conexión a una base de datos, en cualquier herramienta que uses, pide las mismas cinco cosas. Apréndelas una vez.
| Ajuste | La pregunta que responde | En el juego | Aspecto |
|---|---|---|---|
| Host | ¿En qué máquina está la base de datos? | A qué servidor te unes | Un nombre o un número: db.example.com |
| Puerto | ¿Por qué puerta de esa máquina? | Qué puerta de ese servidor | Un número: 5432 |
| Base de datos | ¿Qué base de datos de ese servidor? | Qué mundo de ese servidor | Un nombre: shop |
| Usuario | ¿Quién eres? | Tu cuenta | Un nombre: your_user |
| Contraseña | ¿Puedes demostrarlo? | La contraseña de tu cuenta | Secreta. Nunca se muestra en una página como esta. |
Tres de esas palabras son nuevas:
- El host es el nombre o la dirección de red de la máquina donde funciona el servidor de la base de datos.
- Un puerto es una puerta numerada de una máquina. Una máquina puede ejecutar muchos programas que escuchan a la red, y cada uno espera tras su propio número. La puerta habitual de PostgreSQL es la 5432. La página web de Superset usa otra, la 8088: no las confundas.
- Un servidor de base de datos puede contener varias bases de datos separadas, como un servidor de juego que aloja varios mundos. Tienes que decir cuál quieres.
Y luego hay una sexta cosa que ningún formulario te pide escribir:
Un driver es un pequeño programa que permite a un programa hablar con un tipo concreto de base de datos.
Superset habla SQL. Pero PostgreSQL, MySQL y las demás esperan que ese SQL llegue por la red a su manera. El driver es el traductor. El driver de Superset para PostgreSQL se llama psycopg2; para MySQL necesitaría otro distinto.
Cuidado: \"la contraseña es correcta, así que tiene que conectar\"
No sin el driver. Si el traductor no está instalado, Superset no puede decirle ni una palabra a esa base de datos, por muy correcta que sea la contraseña. En Superset lo notas pronto: una base de datos cuyo driver falta no aparece en la lista de bases de datos a las que puedes conectarte.
Las cinco en una línea: la cadena de conexión¶
Escribir cinco casillas es una manera de dar los datos. La otra es una línea de texto.
Una cadena de conexión es una sola línea que contiene todos los datos de una conexión, en un orden fijo.
Para PostgreSQL en Superset tiene este patrón:
postgresql://USER:PASSWORD@HOST:PORT/DATABASE
Con valores inventados, para que veas dónde va cada parte:
postgresql://your_user:your_password@db.example.com:5432/shop
| Pieza | Ajuste |
|---|---|
postgresql:// |
El tipo de base de datos, que le dice a Superset qué driver usar |
your_user |
Usuario |
your_password |
Contraseña |
db.example.com |
Host |
5432 |
Puerto |
shop |
Base de datos |
Lee la puntuación y podrás descifrar cualquier cadena de conexión: :// después del tipo de base de datos, : entre usuario y contraseña, @ antes del host, : antes del puerto, / antes de la base de datos.
Una cadena de conexión es una contraseña
Mira otra vez el segundo ejemplo: la contraseña está ahí, en texto plano. Una cadena de conexión es la llave de toda la base de datos. No pegues nunca una en un chat, una captura de pantalla, una pregunta de foro ni un archivo que compartas. Los valores de esta página están inventados a propósito; los tuyos te los dan en clase y se quedan ahí.
Dónde se pone en Superset¶
En Superset, una conexión se crea una sola vez y luego todos los que usan ese Superset trabajan a través de ella. En tu VM de clase ya existe, con el nombre Dades classe. Así se crea una, para que sepas qué estás mirando.
| Paso | Haz esto | Deberías ver |
|---|---|---|
| 1 | Settings → Database Connections | La lista de conexiones que conoce Superset |
| 2 | + Database, luego elige PostgreSQL | Un formulario con las casillas Host, Port, Database name, Username, Password y Display Name |
| 3 | Rellena los cinco ajustes y un Display Name: la etiqueta que verá la gente | |
| 4 | Pulsa Connect | Superset prueba la conexión. Si algún dato es incorrecto, aquí aparece un error. |
| 5 | Edita la conexión (icono del lápiz) → Advanced → Security → marca Allow file uploads to database → Finish | En la lista: la conexión, su backend postgresql y una marca en File upload |
El paso 5 no es uno de los cinco ajustes. Es un permiso: un interruptor del lado de Superset que decide qué puede hacer la gente a través de esta conexión. Sin él, nadie puede cargar un archivo en esa base de datos desde Superset.
Así que la lista completa para "configurar el acceso" es: host, puerto, base de datos, usuario, contraseña, driver y permisos.
Leer el error¶
Las conexiones fallan. Es normal, y el mensaje de error no es ruido: te dice hasta dónde llegaste.
| Lo que ves | Hasta dónde llegaste | El ajuste que comprobar |
|---|---|---|
| El tipo de base de datos no está en la lista | A ningún sitio: no hay traductor | Driver |
| Un mensaje que contiene Connection refused | Llamaste y no había nadie tras esa puerta | Host o puerto |
| Un mensaje que dice que la contraseña de tu usuario es incorrecta | Llegaste al servidor y dijo que no | Usuario o contraseña |
| La conexión funciona, pero no aparece en el formulario de subida | Estás dentro, pero no tienes permiso para hacer eso | Permiso: Allow file uploads |
| La subida funciona, pero la tabla tiene una sola columna | No es un problema de conexión en absoluto | El separador del archivo |
¿Qué es mejor noticia: connection refused o contraseña incorrecta? Contraseña incorrecta. Significa que el host y el puerto eran correctos y que un servidor respondió. Estás a un error de tecleo. Connection refused significa que ni siquiera has encontrado todavía el servidor.
Cuidado: localhost no siempre es tu ordenador
localhost es un nombre de host especial que significa "esta misma máquina": la máquina donde se ejecuta el programa que usa la palabra. También puedes verlo escrito como el número 127.0.0.1.
Cuando tú escribes localhost en tu navegador, significa tu ordenador. Pero en un formulario de conexión, el programa que usará la palabra es Superset, y Superset se ejecuta en un servidor. Así que ahí localhost significa "busca la base de datos dentro de la máquina donde se ejecuta el propio Superset". Si la base de datos está en otro sitio, Superset llama a su propia puerta, no encuentra a nadie e informa connection refused.
En el juego: "esta consola" es siempre la tuya. Para llegar a la de un amigo, necesitas su gamertag. El host es el gamertag.
Así que cuando veas connection refused, no concluyas que la base de datos está apagada. Normalmente está encendida y el host es el equivocado.
Cargar un CSV en la base de datos¶
En la última página descargaste pokemon_df.csv. Un archivo en tu disco es botín en tu mochila. Para consultarlo con SQL, tiene que convertirse en una tabla de la base de datos.
Superset puede hacerlo por ti: lee el archivo y crea la tabla en PostgreSQL, a través de la conexión.
| Paso | Haz esto | Deberías ver |
|---|---|---|
| 1 | + (arriba a la derecha) → Data → Upload CSV to database | El formulario de subida |
| 2 | CSV file: elige pokemon_df.csv |
|
| 3 | Database: Dades classe |
Si no está en la lista, falta el permiso Allow file uploads |
| 4 | Schema: public. No lo dejes nunca vacío. |
Si se deja vacío, la subida falla con schema "undefined" does not exist |
| 5 | Table name: pokemon. Corto, en minúsculas, sin espacios. |
|
| 6 | Delimiter: compruébalo con el archivo. El nuestro usa una coma. | |
| 7 | Upload | Datasets ahora lista pokemon |
Dos palabras nuevas:
- Un esquema (schema) es una carpeta de tablas dentro de una base de datos.
publices el que PostgreSQL te da desde el principio. - Un dataset es el nombre que da Superset a "algo con lo que puedo construir gráficos". Aquí es una etiqueta que apunta a tu nueva tabla. Conocerás bien los datasets en Datasets y destino.
El paso 6 es donde la página anterior da sus frutos. Si tu archivo usa ; entre valores y el formulario sigue diciendo ,, la subida "funciona" y obtienes una tabla con una sola columna muy ancha. Y si los números usan coma decimal, pon también File settings → Decimal character en ,.
Cuidado: \"la subida estropeó mis datos\"
No lo hizo. El archivo está bien; a la herramienta se le dijo el separador o la marca decimal equivocados. Borra la tabla y vuelve a subir con los ajustes correctos. Nada del archivo original ha cambiado.
Una cosa que hace la subida en silencio: en nuestro archivo, un valor ausente se escribe con las dos letras NA. Superset carga esas celdas como NULL, la forma que tiene la base de datos de decir "aquí no hay valor". Charmander solo tiene un tipo, así que su type_2 es NULL. Ese es tu primer contacto con los valores ausentes, el gran tema de UT2.
Primeras preguntas en SQL Lab¶
SQL (Structured Query Language, lenguaje de consulta estructurado) es el lenguaje para hacer preguntas a una base de datos relacional. Una pregunta se llama consulta.
SQL Lab es la página de Superset donde escribes una consulta, la ejecutas y ves la respuesta como una tabla.
Abre SQL → SQL Lab. A la izquierda elige la base de datos Dades classe y el esquema public. Luego haz tres preguntas, una por una, pulsando Run después de cada una.
¿Cuántas filas hay?
SELECT COUNT(*) FROM pokemon;
| count |
|---|
| 949 |
SELECT significa "muéstrame", FROM pokemon dice qué tabla y COUNT(*) cuenta filas. 949 Pokémon: el mismo número que contaste en el editor de texto. El archivo entero llegó.
¿Qué aspecto tienen las filas?
SELECT * FROM pokemon LIMIT 10;
El * significa "todas las columnas" y LIMIT 10 significa "para después de diez filas". Obtienes 10 filas y 22 columnas. Estas son las primeras cuatro filas y algunas de las columnas:
| id | pokemon | height | weight | type_1 | type_2 | hp | attack |
|---|---|---|---|---|---|---|---|
| 1 | bulbasaur | 0.7 | 6.9 | grass | poison | 45 | 49 |
| 2 | ivysaur | 1 | 13 | grass | poison | 60 | 62 |
| 3 | venusaur | 2 | 100 | grass | poison | 80 | 82 |
| 4 | charmander | 0.6 | 8.5 | fire | NULL |
39 | 52 |
Ejecuta siempre esta en una tabla que no hayas visto nunca. Cuesta un segundo y te muestra los nombres de las columnas, el tipo de valor de cada una y sorpresas como ese NULL.
¿Qué tipo golpea más fuerte?
SELECT type_1, COUNT(*) AS n, ROUND(AVG(attack)) AS avg_attack
FROM pokemon
GROUP BY type_1
ORDER BY avg_attack DESC;
La respuesta tiene 18 filas, una por tipo. Las cinco primeras:
| type_1 | n | avg_attack |
|---|---|---|
| dragon | 39 | 109 |
| fighting | 31 | 99 |
| ground | 36 | 96 |
| steel | 30 | 93 |
| rock | 65 | 90 |
Léela como una frase: para cada tipo principal, cuenta los Pokémon y haz la media de su ataque, luego ordena de la media más alta hacia abajo. Los tipos dragón golpean más fuerte, con un ataque medio de 109. El tipo más común, water, tiene 126 Pokémon, pero está muy abajo en la lista con una media de 75.
No te preocupes si esa tercera consulta parece mucho. GROUP BY es la única idea realmente nueva que contiene y tiene su propia página: SQL Lab: grupos.
Fíjate en lo que acaba de pasar. En el juego de crafteo, esto fue toda la etapa 1: encontraste el botín (un CSV en una web), te lo llevaste a casa (la subida) y lo guardaste donde puedes trabajar con él (una tabla). Y hiciste una pregunta que un editor de texto nunca podría responder.
Pruébalo: tu primera conexión¶
En tu VM de clase, con Superset abierto en el navegador:
| Paso | Haz esto | Deberías ver |
|---|---|---|
| 1 | Abre Settings → Database Connections y busca Dades classe |
Backend postgresql y una marca en File upload |
| 2 | Abre Datasets. Si pokemon no aparece, sube pokemon_df.csv como se explica arriba. |
pokemon en la lista |
| 3 | En SQL Lab, ejecuta las tres consultas de esta página | 949; diez filas; dragon arriba con 109 |
| 4 | Cambia la tercera consulta para usar type_2 en lugar de type_1 (en los tres sitios) |
Una clasificación distinta, con fighting arriba con 112 y una fila donde el tipo es NULL |
| 5 | Escribe, sin mirar: los cinco ajustes de una conexión y la sexta cosa | Host, puerto, base de datos, usuario, contraseña; y el driver |
Si descargaste tu propio conjunto de datos en la búsqueda de datos abiertos, súbelo también, con su propio nombre de tabla, y adapta la tercera consulta a la pregunta que escribiste en tu ficha.
Ideas clave¶
- Superset es un cliente: conecta, pregunta y dibuja. Tus filas viven en el servidor de base de datos (PostgreSQL), no en Superset.
- Una conexión necesita cinco cosas: host, puerto, base de datos, usuario y contraseña. El puerto habitual de PostgreSQL es el 5432.
- El driver es el traductor entre una herramienta y un tipo de base de datos. Sin driver no hay conexión, ni siquiera con la contraseña correcta.
- Una cadena de conexión empaqueta todo en una línea, contraseña incluida. Trátala como un secreto.
- Los mensajes de error dicen hasta dónde llegaste: connection refused apunta al host o al puerto; contraseña incorrecta significa que ya llegaste al servidor.
localhostsignifica "la máquina donde se ejecuta este programa". Para Superset, es su propio servidor, no tu ordenador.- Subir un CSV crea una tabla real en la base de datos. Comprueba el esquema y el delimitador en el formulario. Luego hazle preguntas en SQL Lab.
Comprobación rápida¶
1. ¿Qué lista contiene los cinco ajustes de una conexión a una base de datos?
- Host, puerto, driver, navegador, contraseña
- Host, puerto, base de datos, usuario, contraseña
- Archivo, separador, codificación, hoja, cabecera
- Servidor, esquema, tabla, columna, fila
Host (qué máquina), puerto (qué puerta), base de datos (qué mundo), usuario y contraseña (tu cuenta). El driver es la sexta cosa, pero no la escribes en el formulario: es software que debe estar instalado.
2. ¿Para qué sirve el driver?
- Guarda la contraseña para que no tengas que escribirla de nuevo
- Hace que las consultas se ejecuten más rápido
- Permite a un programa hablar con un tipo concreto de base de datos
- Convierte archivos CSV en tablas
El driver es el traductor. Superset habla SQL, pero cada tipo de base de datos lo espera a su manera por la red. Sin el driver correcto, Superset no puede hablar en absoluto con esa base de datos.
3. En la cadena de conexión postgresql://ana:s3cret@data.example.org:5432/library, ¿cuál es el host?
-
ana -
library -
data.example.org -
postgresql
El patrón es postgresql://USER:PASSWORD@HOST:PORT/DATABASE. El host viene después de la @ y antes de los : del puerto. Aquí el usuario es ana, el puerto es 5432 y la base de datos es library. Y sí: la contraseña se lee en medio, por eso una cadena de conexión es un secreto.
4. Superset muestra un mensaje que dice que la contraseña de tu usuario es incorrecta. ¿Qué te dice eso?
- El servidor de base de datos está apagado
- El driver no está instalado
- El host y el puerto son correctos: llegaste al servidor y rechazó el inicio de sesión
- El archivo CSV tiene el separador equivocado
Para rechazar una contraseña, un servidor primero tiene que responder. Así que host y puerto están bien y el problema está en el usuario o la contraseña. Es mejor noticia que connection refused, donde todavía no has encontrado el servidor.
5. ¿Dónde se guardan las 949 filas de Pokémon después de subir el CSV desde Superset?
- Dentro de Superset, junto a los gráficos
- En tu navegador
- En una tabla de la base de datos PostgreSQL
- Solo en el archivo CSV original
Superset lee el archivo y crea una tabla en la base de datos, a través de la conexión. Superset en sí solo guarda sus ajustes: usuarios, conexiones y gráficos. Cualquier otra herramienta con los datos de conexión correctos podría leer esa tabla.
6. ¿Qué devuelve SELECT COUNT(*) FROM pokemon;?
- La primera fila de la tabla
- Los nombres de las columnas
- Un número: cuántas filas tiene la tabla
- Todas las filas de la tabla
COUNT(*) cuenta filas, así que la respuesta es un único número: 949. Para ver filas escribirías SELECT * FROM pokemon LIMIT 10;.
7. Un amigo usa Superset en un servidor para llegar a una base de datos MySQL de otro servidor llamado botiga. La casilla del host dice 127.0.0.1 y Superset responde connection refused. Elige las dos afirmaciones verdaderas.
-
127.0.0.1significa "esta misma máquina", así que Superset busca MySQL en su propio servidor; el host debería serbotiga - La contraseña es incorrecta: connection refused siempre significa contraseña errónea
- Superset también necesita tener instalado un driver de MySQL, o no puede hablar con MySQL en absoluto
- MySQL no se puede usar desde Superset, solo PostgreSQL
127.0.0.1 es localhost escrito como número: la máquina donde se ejecuta el programa. Superset llamó a su propia puerta. Connection refused apunta al host o al puerto, no a la contraseña. Y cada tipo de base de datos necesita su propio driver: el de PostgreSQL no habla MySQL.
La puerta está abierta y la tabla está dentro. Hasta ahora lo pedías todo; a continuación aprendes a pedir exactamente las filas que necesitas: SQL Lab: filtros.