SQLx CLI
- Permite administrar la base de datos a la que se conecta
- Migraciones
- Todos los comandos requieren la variable
DATABASE_URL(puede estar en el archivo .env)
Instalar
# Todas las bases de datos disponibles en SQLx, y OpenSSL
# cargo install sqlx-cli
# Postgres y NativeTLS
# cargo install sqlx-cli --no-default-features --features native-tls,postgres
# Postgres y Rustls
cargo install sqlx-cli --no-default-features --features rustls,postgres
Comandos
Crear o eliminar la base de datos
- La establecida en
DATABASE_URL
sqlx database create
sqlx database drop
Crear migración
- Genera un nuevo archivo en
migrations/<timestamp>-<name>.sql - Genera una tabla en la base de datos para guardar el historial de migraciones
- Por defecto las migraciones no son reversibles
- Para crear migraciones reversibles con los scripts (archivos) "up" y "down", utilizar la flag
-ral crear la primera migración
sqlx migrate add -r <name>
- Todas las migraciones posteriores también serán reversibles.
sqlx migrate add <name1>
Ejemplo
migrations\123_users.down.sql
-- Add down migration script here
DROP TABLE IF EXISTS users;
migrations\123_users.up.sql
-- Add up migration script here
CREATE TABLE
IF NOT EXISTS users (
id SERIAL,
name VARCHAR(50) NOT NULL,
age INT NOT NULL,
CONSTRAINT pk_users PRIMARY KEY (id)
);
Ejecutar migraciones
Compara el historial de migraciones de la base de datos en ejecución con la carpeta migrations/ y ejecuta cualquier script que aún esté pendiente.
sqlx migrate run
Reversiones
- Ejecuta un script
abc.down.sqla la vez - Si es necesario revertir varios scrips, ejecutar el comando varias veces
- El orden es en base al timestamp que tiene el nombre del archivo
sqlx migrate revert
Migraciones desde el proyecto
- Código dentro de la aplicación para aplicar migraciones en lugar de los comandos
- El código intenta ejecutar las migraciones cada vez que se compila o inicia la aplicación
- Alternativa en código (a los comandos en la consola) para aplicar las migraciones
fn main(){
// let pool = ...
sqlx::migrate!("./migrations")
.run(&pool)
.await
.expect("Can't execute migrations");
}
Migraciones cuando no hay cambios en el código
- Cuando solo se agregan o editan migraciones (SQL) pero no el código del proyecto en Rust
- El compilador verifica si hay nuevos cambios en el código de Rust para compilar, si no hay, entonces no lo vuelve a compilar, por lo que no podría ejecutar las migraciones
- Se debe agregar un script que se ejecuta siempre al compilar
- Generar script
#~/.cargo/bin/sqlx migrate build-script
sqlx migrate build-script
- Compilar como se haría normalmente
cargo build -r