Saltar al contenido principal

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 -r al 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.sql a 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
  1. Generar script
#~/.cargo/bin/sqlx migrate build-script   
sqlx migrate build-script
  1. Compilar como se haría normalmente
cargo build -r