From 7876efabea24ff65f95b379e5b10dbb73d404d5a Mon Sep 17 00:00:00 2001 From: Jonatas Oliveira Date: Wed, 18 Jun 2025 09:26:38 +0200 Subject: [PATCH 1/4] chore: add example with postgres and add rusqlite in new directory --- examples/postgres_docker_sql/Cargo.toml | 9 +++++ examples/postgres_docker_sql/Dockerfile | 21 ++++++++++ .../postgres_docker_sql/docker-compose.yml | 23 +++++++++++ .../migrations/V1__init.sql | 8 ++++ examples/postgres_docker_sql/src/main.rs | 39 +++++++++++++++++++ examples/{ => rusqlite}/Cargo.toml | 0 .../{ => rusqlite}/migrations/V1__initial.sql | 0 .../migrations/V2__add_cars_table.sql | 0 .../migrations/V3__add_brand_to_cars_table.rs | 0 examples/{ => rusqlite}/src/main.rs | 0 10 files changed, 100 insertions(+) create mode 100644 examples/postgres_docker_sql/Cargo.toml create mode 100644 examples/postgres_docker_sql/Dockerfile create mode 100644 examples/postgres_docker_sql/docker-compose.yml create mode 100644 examples/postgres_docker_sql/migrations/V1__init.sql create mode 100644 examples/postgres_docker_sql/src/main.rs rename examples/{ => rusqlite}/Cargo.toml (100%) rename examples/{ => rusqlite}/migrations/V1__initial.sql (100%) rename examples/{ => rusqlite}/migrations/V2__add_cars_table.sql (100%) rename examples/{ => rusqlite}/migrations/V3__add_brand_to_cars_table.rs (100%) rename examples/{ => rusqlite}/src/main.rs (100%) diff --git a/examples/postgres_docker_sql/Cargo.toml b/examples/postgres_docker_sql/Cargo.toml new file mode 100644 index 00000000..ee3560d5 --- /dev/null +++ b/examples/postgres_docker_sql/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "refinery-migrations-postgres" +version = "0.1.0" +edition = "2024" + +[dependencies] +refinery = { version = "0.8", features = ["postgres", "tokio-postgres"]} +tokio = { version = "1", features = ["full"] } +tokio-postgres = "0.7" diff --git a/examples/postgres_docker_sql/Dockerfile b/examples/postgres_docker_sql/Dockerfile new file mode 100644 index 00000000..c145c1b2 --- /dev/null +++ b/examples/postgres_docker_sql/Dockerfile @@ -0,0 +1,21 @@ +FROM rust:slim as builder + +WORKDIR /usr/src/app + +COPY Cargo.toml Cargo.lock ./ +COPY migrations ./migrations +COPY src ./src + +RUN cargo build --release + +FROM debian:stable-slim + +RUN apt-get update \ + && apt-get install -y --no-install-recommends ca-certificates libssl-dev \ + && rm -rf /var/lib/apt/lists/* + +COPY --from=builder /usr/src/app/target/release/refinery-migrations-postgres /usr/local/bin/refinery-migrations-postgres + +ENV DATABASE_URL="postgres://postgres:password@db:5432/postgres" + +ENTRYPOINT ["refinery-migrations-postgres"] diff --git a/examples/postgres_docker_sql/docker-compose.yml b/examples/postgres_docker_sql/docker-compose.yml new file mode 100644 index 00000000..e163a9a6 --- /dev/null +++ b/examples/postgres_docker_sql/docker-compose.yml @@ -0,0 +1,23 @@ +services: + db: + image: postgres:latest + environment: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: password + POSTGRES_DB: refinery + volumes: + - db_data:/var/lib/postgresql/data + ports: + - "5432:5432" + + migrations: + build: . + depends_on: + - db + restart: "no" + environment: + DATABASE_URL: "postgres://postgres:password@db:5432/refinery" + tty: true + +volumes: + db_data: diff --git a/examples/postgres_docker_sql/migrations/V1__init.sql b/examples/postgres_docker_sql/migrations/V1__init.sql new file mode 100644 index 00000000..ac5e63cc --- /dev/null +++ b/examples/postgres_docker_sql/migrations/V1__init.sql @@ -0,0 +1,8 @@ +CREATE TABLE transactions ( + id SERIAL PRIMARY KEY, + date DATE NOT NULL, + kind VARCHAR(6) NOT NULL, + amount NUMERIC NOT NULL, + description TEXT NOT NULL, + tag VARCHAR(50) NOT NULL +); diff --git a/examples/postgres_docker_sql/src/main.rs b/examples/postgres_docker_sql/src/main.rs new file mode 100644 index 00000000..8577538f --- /dev/null +++ b/examples/postgres_docker_sql/src/main.rs @@ -0,0 +1,39 @@ +use tokio_postgres::NoTls; + +// macro que gera o módulo `embedded::migrations` +mod embedded { + use refinery::embed_migrations; + embed_migrations!("migrations"); +} + +#[tokio::main] +async fn main() -> Result<(), Box> { + // 1) URL do banco + let db_url = std::env::var("DATABASE_URL") + .unwrap_or_else(|_| "postgres://postgres:password@localhost:5432/postgres".into()); + + // 2) conecta com tokio-postgres + let (client, connection) = tokio_postgres::connect(&db_url, NoTls).await?; + + // 3) roda a parte de I/O do driver em background + tokio::spawn(async move { + if let Err(e) = connection.await { + eprintln!("connection error: {}", e); + } + }); + + // 4) precisa de &mut Client para AsyncMigrate + let mut client = client; + + // 5) executa as migrações + let report = embedded::migrations::runner() + .run_async(&mut client) // agora compila, porque Client: AsyncMigrate + .await?; + + println!("Migrações aplicadas com sucesso:"); + for m in report.applied_migrations() { + println!("→ {} (versão {})", m.name(), m.version()); + } + + Ok(()) +} diff --git a/examples/Cargo.toml b/examples/rusqlite/Cargo.toml similarity index 100% rename from examples/Cargo.toml rename to examples/rusqlite/Cargo.toml diff --git a/examples/migrations/V1__initial.sql b/examples/rusqlite/migrations/V1__initial.sql similarity index 100% rename from examples/migrations/V1__initial.sql rename to examples/rusqlite/migrations/V1__initial.sql diff --git a/examples/migrations/V2__add_cars_table.sql b/examples/rusqlite/migrations/V2__add_cars_table.sql similarity index 100% rename from examples/migrations/V2__add_cars_table.sql rename to examples/rusqlite/migrations/V2__add_cars_table.sql diff --git a/examples/migrations/V3__add_brand_to_cars_table.rs b/examples/rusqlite/migrations/V3__add_brand_to_cars_table.rs similarity index 100% rename from examples/migrations/V3__add_brand_to_cars_table.rs rename to examples/rusqlite/migrations/V3__add_brand_to_cars_table.rs diff --git a/examples/src/main.rs b/examples/rusqlite/src/main.rs similarity index 100% rename from examples/src/main.rs rename to examples/rusqlite/src/main.rs From 8ea5b0998edfc8b520f4b4964df9b9baffb92e16 Mon Sep 17 00:00:00 2001 From: Jonatas Oliveira Date: Wed, 18 Jun 2025 09:35:09 +0200 Subject: [PATCH 2/4] chore: add examples/rusqlite in Cargo.toml --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 9cd4a9ed..ba619711 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,7 +5,7 @@ members = [ "refinery_cli", "refinery_core", "refinery_macros", - "examples", + "examples/rusqlite", ] [profile.release] From 1f32a77fe9b0fbfa1722b00a30dd5a0bcd06029a Mon Sep 17 00:00:00 2001 From: Jonatas Oliveira Date: Wed, 18 Jun 2025 09:41:31 +0200 Subject: [PATCH 3/4] chore: fix imports to lib in examples --- examples/postgres_docker_sql/Cargo.toml | 2 +- examples/postgres_docker_sql/src/main.rs | 16 +++------------- examples/rusqlite/Cargo.toml | 2 +- 3 files changed, 5 insertions(+), 15 deletions(-) diff --git a/examples/postgres_docker_sql/Cargo.toml b/examples/postgres_docker_sql/Cargo.toml index ee3560d5..dedd38fa 100644 --- a/examples/postgres_docker_sql/Cargo.toml +++ b/examples/postgres_docker_sql/Cargo.toml @@ -4,6 +4,6 @@ version = "0.1.0" edition = "2024" [dependencies] -refinery = { version = "0.8", features = ["postgres", "tokio-postgres"]} +refinery = { path = "../../refinery", features = ["postgres", "tokio-postgres"] } tokio = { version = "1", features = ["full"] } tokio-postgres = "0.7" diff --git a/examples/postgres_docker_sql/src/main.rs b/examples/postgres_docker_sql/src/main.rs index 8577538f..8e575b3c 100644 --- a/examples/postgres_docker_sql/src/main.rs +++ b/examples/postgres_docker_sql/src/main.rs @@ -1,6 +1,5 @@ use tokio_postgres::NoTls; -// macro que gera o módulo `embedded::migrations` mod embedded { use refinery::embed_migrations; embed_migrations!("migrations"); @@ -8,31 +7,22 @@ mod embedded { #[tokio::main] async fn main() -> Result<(), Box> { - // 1) URL do banco let db_url = std::env::var("DATABASE_URL") .unwrap_or_else(|_| "postgres://postgres:password@localhost:5432/postgres".into()); - - // 2) conecta com tokio-postgres let (client, connection) = tokio_postgres::connect(&db_url, NoTls).await?; - - // 3) roda a parte de I/O do driver em background tokio::spawn(async move { if let Err(e) = connection.await { eprintln!("connection error: {}", e); } }); - - // 4) precisa de &mut Client para AsyncMigrate let mut client = client; - - // 5) executa as migrações let report = embedded::migrations::runner() - .run_async(&mut client) // agora compila, porque Client: AsyncMigrate + .run_async(&mut client) .await?; - println!("Migrações aplicadas com sucesso:"); + println!("Migrations apllied with success:"); for m in report.applied_migrations() { - println!("→ {} (versão {})", m.name(), m.version()); + println!("→ {} (version {})", m.name(), m.version()); } Ok(()) diff --git a/examples/rusqlite/Cargo.toml b/examples/rusqlite/Cargo.toml index f999299e..c44136b7 100644 --- a/examples/rusqlite/Cargo.toml +++ b/examples/rusqlite/Cargo.toml @@ -12,7 +12,7 @@ edition = "2021" enums = ["refinery/enums"] [dependencies] -refinery = { path = "../refinery", features = ["rusqlite"] } +refinery = { path = "../../refinery", features = ["rusqlite"] } rusqlite = "0.35" barrel = { version = "0.7", features = ["sqlite3"] } log = "0.4" From 8364cca9bec590fc9b732bf2c3ec9bb3388dc28a Mon Sep 17 00:00:00 2001 From: Jonatas Oliveira Date: Wed, 18 Jun 2025 10:02:07 +0200 Subject: [PATCH 4/4] chore: split example between postgres_sql and postgres_docker_sql --- Cargo.toml | 1 + examples/postgres_docker_sql/Cargo.toml | 4 ++- .../postgres_docker_sql/docker-compose.yml | 2 +- examples/postgres_docker_sql/src/main.rs | 2 +- examples/postgres_sql/Cargo.toml | 11 +++++++ examples/postgres_sql/migrations/V1__init.sql | 8 +++++ examples/postgres_sql/src/main.rs | 29 +++++++++++++++++++ 7 files changed, 54 insertions(+), 3 deletions(-) create mode 100644 examples/postgres_sql/Cargo.toml create mode 100644 examples/postgres_sql/migrations/V1__init.sql create mode 100644 examples/postgres_sql/src/main.rs diff --git a/Cargo.toml b/Cargo.toml index ba619711..606beb96 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,6 +6,7 @@ members = [ "refinery_core", "refinery_macros", "examples/rusqlite", + "examples/postgres_sql", ] [profile.release] diff --git a/examples/postgres_docker_sql/Cargo.toml b/examples/postgres_docker_sql/Cargo.toml index dedd38fa..13a746ce 100644 --- a/examples/postgres_docker_sql/Cargo.toml +++ b/examples/postgres_docker_sql/Cargo.toml @@ -1,9 +1,11 @@ [package] name = "refinery-migrations-postgres" +authors = ["Jonatas Oliveira "] +description = "Refinery usage example with postgres and docker" version = "0.1.0" edition = "2024" [dependencies] -refinery = { path = "../../refinery", features = ["postgres", "tokio-postgres"] } +refinery = { version = "0.8", features = ["postgres", "tokio-postgres"]} tokio = { version = "1", features = ["full"] } tokio-postgres = "0.7" diff --git a/examples/postgres_docker_sql/docker-compose.yml b/examples/postgres_docker_sql/docker-compose.yml index e163a9a6..7c0bc266 100644 --- a/examples/postgres_docker_sql/docker-compose.yml +++ b/examples/postgres_docker_sql/docker-compose.yml @@ -14,7 +14,7 @@ services: build: . depends_on: - db - restart: "no" + restart: "on-failure" environment: DATABASE_URL: "postgres://postgres:password@db:5432/refinery" tty: true diff --git a/examples/postgres_docker_sql/src/main.rs b/examples/postgres_docker_sql/src/main.rs index 8e575b3c..2d351e8e 100644 --- a/examples/postgres_docker_sql/src/main.rs +++ b/examples/postgres_docker_sql/src/main.rs @@ -20,7 +20,7 @@ async fn main() -> Result<(), Box> { .run_async(&mut client) .await?; - println!("Migrations apllied with success:"); + println!("Migrations applied with success:"); for m in report.applied_migrations() { println!("→ {} (version {})", m.name(), m.version()); } diff --git a/examples/postgres_sql/Cargo.toml b/examples/postgres_sql/Cargo.toml new file mode 100644 index 00000000..0e123dc2 --- /dev/null +++ b/examples/postgres_sql/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "refinery-migrations-postgres" +authors = ["Jonatas Oliveira "] +description = "Refinery usage example with postgres and docker" +version = "0.1.0" +edition = "2024" + +[dependencies] +refinery = { path = "../../refinery", features = ["postgres", "tokio-postgres"] } +tokio = { version = "1", features = ["full"] } +tokio-postgres = "0.7" diff --git a/examples/postgres_sql/migrations/V1__init.sql b/examples/postgres_sql/migrations/V1__init.sql new file mode 100644 index 00000000..ac5e63cc --- /dev/null +++ b/examples/postgres_sql/migrations/V1__init.sql @@ -0,0 +1,8 @@ +CREATE TABLE transactions ( + id SERIAL PRIMARY KEY, + date DATE NOT NULL, + kind VARCHAR(6) NOT NULL, + amount NUMERIC NOT NULL, + description TEXT NOT NULL, + tag VARCHAR(50) NOT NULL +); diff --git a/examples/postgres_sql/src/main.rs b/examples/postgres_sql/src/main.rs new file mode 100644 index 00000000..8e575b3c --- /dev/null +++ b/examples/postgres_sql/src/main.rs @@ -0,0 +1,29 @@ +use tokio_postgres::NoTls; + +mod embedded { + use refinery::embed_migrations; + embed_migrations!("migrations"); +} + +#[tokio::main] +async fn main() -> Result<(), Box> { + let db_url = std::env::var("DATABASE_URL") + .unwrap_or_else(|_| "postgres://postgres:password@localhost:5432/postgres".into()); + let (client, connection) = tokio_postgres::connect(&db_url, NoTls).await?; + tokio::spawn(async move { + if let Err(e) = connection.await { + eprintln!("connection error: {}", e); + } + }); + let mut client = client; + let report = embedded::migrations::runner() + .run_async(&mut client) + .await?; + + println!("Migrations apllied with success:"); + for m in report.applied_migrations() { + println!("→ {} (version {})", m.name(), m.version()); + } + + Ok(()) +}