# Bases de datos PostgreSQL y MySQL

> Crea bases de datos PostgreSQL o MySQL para tus apps y conéctalas sin que nadie vea la contraseña. Cada base tiene su propio usuario y conexión cifrada.

Dilohost crea bases de datos **PostgreSQL** y **MySQL** para las apps de tus proyectos. Cada base tiene su propio usuario, solo se puede usar desde las apps de tu cuenta y se conecta con cifrado verificado. Tú no copias contraseñas: le pides a tu agente que conecte la base a la app y la app recibe las variables que necesita.

## Antes de empezar

- Necesitas un plan que incluya bases de datos. El plan Gratis y el Autónomo no las incluyen; consulta cuántas bases y cuánto espacio trae cada plan en [Planes y precios](/docs/cuenta/planes).
- La base pertenece a un proyecto. Si aún no tienes uno, el agente lo crea antes (ver [Conceptos básicos](/docs/conceptos)).

## Crear una base de datos

<p class="prompt">Crea una base de datos PostgreSQL llamada datos en el proyecto tienda.</p>

El agente usa `database.create`. Puedes elegir el motor:

| Motor | Valor de `engine` | Cuándo elegirlo |
|---|---|---|
| PostgreSQL | `postgres` (por defecto) | La opción recomendada para casi todo: Laravel, Django, Rails, Node con Prisma o Drizzle… |
| MySQL | `mysql` | Si tu app ya está hecha para MySQL (por ejemplo, algunos WordPress o proyectos PHP antiguos). |

El nombre de la base son de 1 a 20 letras minúsculas y números, sin guiones (por ejemplo `datos` o `db`). Si no dices ninguno, se llama `db`. La respuesta incluye el tamaño máximo que te permite el plan.

## Conectarla a una app

<p class="prompt">Conecta la base datos a la app web del proyecto tienda.</p>

Con `database.connection` e `inject_into` la conexión se guarda como **variables secretas** de la app y la app se reinicia para leerlas. La contraseña no aparece en la conversación en ningún momento.

Variables que recibe la app:

| Variable | PostgreSQL | MySQL |
|---|---|---|
| `DATABASE_URL` | `postgresql://usuario:…@host:puerto/base?sslmode=verify-full&sslrootcert=…` | `mysql://usuario:…@host:puerto/base` |
| `DB_CONNECTION` | `pgsql` | `mysql` |
| `DB_HOST`, `DB_PORT`, `DB_DATABASE`, `DB_USERNAME`, `DB_PASSWORD` | Datos de la conexión | Datos de la conexión |
| `DB_SSLMODE`, `PGSSLMODE` | `verify-full` | — |
| `PGSSLROOTCERT`, `DB_SSLROOTCERT` | Ruta del certificado de la autoridad | — |
| `MYSQL_ATTR_SSL_CA`, `DB_SSL_CA` | — | Ruta del certificado de la autoridad |

Con esto funcionan sin tocar nada **Laravel** (lee `DB_*` y `MYSQL_ATTR_SSL_CA`), **node-postgres** y **Prisma** (leen `DATABASE_URL`) y cualquier cliente basado en libpq, como **psycopg** en Python (lee `PGSSL*`).

> [!TIP]
> Si tu app tiene migraciones, pídele al agente que las lance después de conectar la base: «ejecuta las migraciones de la app web». Lo hace con `app.run` (ver [Diagnóstico y comandos](/docs/publicar/diagnostico)).

Si llamas a `database.connection` sin `inject_into`, el agente recibe el motor, el servidor, el puerto, la base y el usuario, pero **nunca la contraseña**.

## Conexión cifrada

Todas las conexiones a las bases van cifradas y verifican el certificado del servidor (`verify-full` en PostgreSQL; en MySQL los usuarios exigen TLS). Una conexión sin cifrar se rechaza antes de pedir la contraseña. La app no tiene que configurar nada: el certificado de la autoridad está montado en todas las apps y las variables de arriba ya apuntan a él.

## Quién puede entrar

- Cada base tiene **un usuario propio** que solo ve esa base. Las bases de otras cuentas, y las otras bases de tu cuenta, no son accesibles con ese usuario.
- La base **solo se alcanza desde las apps de tu cuenta**. No está publicada en Internet, así que no puedes conectarte desde tu ordenador con un cliente de escritorio.
- Para trabajar con los datos desde fuera, descarga una copia (ver [Copias de seguridad](/docs/datos/copias)) o ejecuta comandos de la app con `app.run`.

## Tamaño y límites

`database.list` enseña cada base con su motor, su estado y lo que ocupa, junto con el límite del plan.

| Situación | Qué pasa |
|---|---|
| Llegas al 80 % del espacio del plan | Te avisamos (como mucho una vez al día). |
| Pasas del 110 % | Se corta el acceso a la base: la app deja de poder conectarse, pero **no se borra nada**. |
| Liberas espacio o subes de plan | El acceso vuelve solo. |

## Borrar una base

<p class="prompt">Borra la base de datos pruebas del proyecto tienda.</p>

`database.delete` **pide confirmación** y es irreversible: se borran la base y todas sus copias, y las apps que la usen empezarán a fallar. Si quieres conservar los datos, descarga antes una copia con `backup.download_link`.

## Problemas frecuentes

- **«Tu plan no incluye bases de datos»**: el plan Gratis y el Autónomo no tienen. Mira [Planes y precios](/docs/cuenta/planes).
- **La app no conecta después de crear la base**: falta conectarla con `inject_into`; crearla no le da las variables a ninguna app.
- **Error de certificado en una app Node**: usa `DATABASE_URL` tal cual (ya incluye `sslrootcert`), sin cambiar `sslmode`.

## Relacionado

- [Copias de seguridad](/docs/datos/copias)
- [Variables de entorno y secretos](/docs/publicar/variables)
- [Referencia: herramienta `database`](/docs/referencia/herramientas#database)
