From 0391aa2dbe00f8804fa287e752d828782a09817d Mon Sep 17 00:00:00 2001 From: manuelarte Date: Wed, 14 Aug 2024 10:38:02 +0200 Subject: [PATCH 1/2] Adding example diesel r2d2 --- Cargo.lock | 146 ++++++++++++++++++ .../embedded_async_diesel_r2d2/Cargo.toml | 12 ++ .../embedded_async_diesel_r2d2/src/main.rs | 44 ++++++ 3 files changed, 202 insertions(+) create mode 100644 examples/embedded_async_diesel_r2d2/Cargo.toml create mode 100644 examples/embedded_async_diesel_r2d2/src/main.rs diff --git a/Cargo.lock b/Cargo.lock index da56139..2b8d2fd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -583,6 +583,41 @@ dependencies = [ "typenum", ] +[[package]] +name = "darling" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +dependencies = [ + "darling_core", + "quote", + "syn", +] + [[package]] name = "deflate64" version = "0.1.9" @@ -609,6 +644,42 @@ dependencies = [ "syn", ] +[[package]] +name = "diesel" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf97ee7261bb708fa3402fa9c17a54b70e90e3cb98afb3dc8999d5512cb03f94" +dependencies = [ + "bitflags 2.6.0", + "byteorder", + "diesel_derives", + "itoa", + "pq-sys", + "r2d2", +] + +[[package]] +name = "diesel_derives" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6ff2be1e7312c858b2ef974f5c7089833ae57b5311b334b30923af58e5718d8" +dependencies = [ + "diesel_table_macro_syntax", + "dsl_auto_type", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "diesel_table_macro_syntax" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "209c735641a413bc68c4923a9d6ad4bcb3ca306b794edaa7eb0b3228a99ffb25" +dependencies = [ + "syn", +] + [[package]] name = "digest" version = "0.10.7" @@ -651,6 +722,20 @@ dependencies = [ "tracing-subscriber", ] +[[package]] +name = "dsl_auto_type" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5d9abe6314103864cc2d8901b7ae224e0ab1a103a0a416661b4097b0779b607" +dependencies = [ + "darling", + "either", + "heck", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "either" version = "1.13.0" @@ -668,6 +753,16 @@ dependencies = [ "tokio", ] +[[package]] +name = "embedded_async_diesel_r2d2" +version = "0.16.1" +dependencies = [ + "diesel", + "postgresql_embedded", + "r2d2_postgres", + "tokio", +] + [[package]] name = "embedded_sync" version = "0.16.1" @@ -1133,6 +1228,12 @@ dependencies = [ "tracing", ] +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + [[package]] name = "idna" version = "0.5.0" @@ -1884,6 +1985,15 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "pq-sys" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a24ff9e4cf6945c988f0db7005d87747bf72864965c3529d259ad155ac41d584" +dependencies = [ + "vcpkg", +] + [[package]] name = "proc-macro2" version = "1.0.86" @@ -1960,6 +2070,27 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "r2d2" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51de85fb3fb6524929c8a2eb85e6b6d363de4e8c48f9e2c2eac4944abc181c93" +dependencies = [ + "log", + "parking_lot 0.12.3", + "scheduled-thread-pool", +] + +[[package]] +name = "r2d2_postgres" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7029c56be658cb54f321e0bee597810ee16796b735fa2559d7056bf06b12230b" +dependencies = [ + "postgres", + "r2d2", +] + [[package]] name = "rand" version = "0.8.5" @@ -2343,6 +2474,15 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "scheduled-thread-pool" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cbc66816425a074528352f5789333ecff06ca41b36b0b0efdfbb29edc391a19" +dependencies = [ + "parking_lot 0.12.3", +] + [[package]] name = "scopeguard" version = "1.2.0" @@ -2691,6 +2831,12 @@ dependencies = [ "unicode-properties", ] +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + [[package]] name = "subtle" version = "2.6.1" diff --git a/examples/embedded_async_diesel_r2d2/Cargo.toml b/examples/embedded_async_diesel_r2d2/Cargo.toml new file mode 100644 index 0000000..405da75 --- /dev/null +++ b/examples/embedded_async_diesel_r2d2/Cargo.toml @@ -0,0 +1,12 @@ +[package] +edition.workspace = true +name = "embedded_async_diesel_r2d2" +publish = false +license.workspace = true +version.workspace = true + +[dependencies] +postgresql_embedded = { path = "../../postgresql_embedded" } +tokio = { workspace = true, features = ["full"] } +diesel = { version = "2.2.1", features = ["postgres", "r2d2"] } +r2d2_postgres = "0.18.1" \ No newline at end of file diff --git a/examples/embedded_async_diesel_r2d2/src/main.rs b/examples/embedded_async_diesel_r2d2/src/main.rs new file mode 100644 index 0000000..a179b88 --- /dev/null +++ b/examples/embedded_async_diesel_r2d2/src/main.rs @@ -0,0 +1,44 @@ +#![forbid(unsafe_code)] +#![deny(clippy::pedantic)] + +use diesel::r2d2::{ConnectionManager, Pool}; +use diesel::PgConnection; +use postgresql_embedded::{PostgreSQL, Result, Settings, VersionReq}; + +#[tokio::main] +async fn main() -> Result<()> { + let settings = Settings { + version: VersionReq::parse("=16.4.0")?, + ..Default::default() + }; + let mut postgresql = PostgreSQL::new(settings); + postgresql.setup().await?; + postgresql.start().await?; + + let database_name = "test"; + postgresql.create_database(database_name).await?; + postgresql.database_exists(database_name).await?; + + { + let database_url = postgresql.settings().url(database_name); + let manager = ConnectionManager::::new(database_url); + let _pool = Pool::builder() + .test_on_check_out(true) + .build(manager) + .expect("Could not build connection pool"); + } + + postgresql.drop_database(database_name).await?; + + postgresql.stop().await +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn test_main() -> Result<()> { + main() + } +} From bd8b96fbb82b602c70a3f7e7cf6cc93fc94916bb Mon Sep 17 00:00:00 2001 From: Manuel Doncel Martos Date: Sat, 17 Aug 2024 22:33:09 +0200 Subject: [PATCH 2/2] Adding creating a post, example coming from https://diesel.rs/guides/getting-started --- Cargo.lock | 85 +++++++++++++++++++ .../embedded_async_diesel_r2d2/Cargo.toml | 3 +- .../embedded_async_diesel_r2d2/diesel.toml | 9 ++ .../migrations/.keep | 0 .../2024-08-17-200823_create_posts/down.sql | 1 + .../2024-08-17-200823_create_posts/up.sql | 6 ++ .../embedded_async_diesel_r2d2/src/main.rs | 34 +++++++- .../embedded_async_diesel_r2d2/src/models.rs | 18 ++++ .../embedded_async_diesel_r2d2/src/schema.rs | 8 ++ 9 files changed, 161 insertions(+), 3 deletions(-) create mode 100644 examples/embedded_async_diesel_r2d2/diesel.toml create mode 100644 examples/embedded_async_diesel_r2d2/migrations/.keep create mode 100644 examples/embedded_async_diesel_r2d2/migrations/2024-08-17-200823_create_posts/down.sql create mode 100644 examples/embedded_async_diesel_r2d2/migrations/2024-08-17-200823_create_posts/up.sql create mode 100644 examples/embedded_async_diesel_r2d2/src/models.rs create mode 100644 examples/embedded_async_diesel_r2d2/src/schema.rs diff --git a/Cargo.lock b/Cargo.lock index 2b8d2fd..b1602a8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -671,6 +671,17 @@ dependencies = [ "syn", ] +[[package]] +name = "diesel_migrations" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a73ce704bad4231f001bff3314d91dce4aba0770cee8b233991859abc15c1f6" +dependencies = [ + "diesel", + "migrations_internals", + "migrations_macros", +] + [[package]] name = "diesel_table_macro_syntax" version = "0.2.0" @@ -758,6 +769,7 @@ name = "embedded_async_diesel_r2d2" version = "0.16.1" dependencies = [ "diesel", + "diesel_migrations", "postgresql_embedded", "r2d2_postgres", "tokio", @@ -1460,6 +1472,27 @@ version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +[[package]] +name = "migrations_internals" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd01039851e82f8799046eabbb354056283fb265c8ec0996af940f4e85a380ff" +dependencies = [ + "serde", + "toml", +] + +[[package]] +name = "migrations_macros" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffb161cc72176cb37aa47f1fc520d3ef02263d67d661f44f05d05a079e1237fd" +dependencies = [ + "migrations_internals", + "proc-macro2", + "quote", +] + [[package]] name = "mime" version = "0.3.17" @@ -2573,6 +2606,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_spanned" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d" +dependencies = [ + "serde", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -3106,6 +3148,40 @@ dependencies = [ "tokio", ] +[[package]] +name = "toml" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + [[package]] name = "tower" version = "0.4.13" @@ -3665,6 +3741,15 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "winnow" +version = "0.6.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f" +dependencies = [ + "memchr", +] + [[package]] name = "winreg" version = "0.52.0" diff --git a/examples/embedded_async_diesel_r2d2/Cargo.toml b/examples/embedded_async_diesel_r2d2/Cargo.toml index 405da75..fbae524 100644 --- a/examples/embedded_async_diesel_r2d2/Cargo.toml +++ b/examples/embedded_async_diesel_r2d2/Cargo.toml @@ -9,4 +9,5 @@ version.workspace = true postgresql_embedded = { path = "../../postgresql_embedded" } tokio = { workspace = true, features = ["full"] } diesel = { version = "2.2.1", features = ["postgres", "r2d2"] } -r2d2_postgres = "0.18.1" \ No newline at end of file +r2d2_postgres = "0.18.1" +diesel_migrations = { version = "2.2.0", features = ["postgres"] } diff --git a/examples/embedded_async_diesel_r2d2/diesel.toml b/examples/embedded_async_diesel_r2d2/diesel.toml new file mode 100644 index 0000000..83d15a9 --- /dev/null +++ b/examples/embedded_async_diesel_r2d2/diesel.toml @@ -0,0 +1,9 @@ +# For documentation on how to configure this file, +# see https://diesel.rs/guides/configuring-diesel-cli + +[print_schema] +file = "src/schema.rs" +custom_type_derives = ["diesel::query_builder::QueryId", "Clone"] + +[migrations_directory] +dir = "./migrations" diff --git a/examples/embedded_async_diesel_r2d2/migrations/.keep b/examples/embedded_async_diesel_r2d2/migrations/.keep new file mode 100644 index 0000000..e69de29 diff --git a/examples/embedded_async_diesel_r2d2/migrations/2024-08-17-200823_create_posts/down.sql b/examples/embedded_async_diesel_r2d2/migrations/2024-08-17-200823_create_posts/down.sql new file mode 100644 index 0000000..40234d9 --- /dev/null +++ b/examples/embedded_async_diesel_r2d2/migrations/2024-08-17-200823_create_posts/down.sql @@ -0,0 +1 @@ +DROP TABLE posts \ No newline at end of file diff --git a/examples/embedded_async_diesel_r2d2/migrations/2024-08-17-200823_create_posts/up.sql b/examples/embedded_async_diesel_r2d2/migrations/2024-08-17-200823_create_posts/up.sql new file mode 100644 index 0000000..e03961c --- /dev/null +++ b/examples/embedded_async_diesel_r2d2/migrations/2024-08-17-200823_create_posts/up.sql @@ -0,0 +1,6 @@ +CREATE TABLE posts ( + id SERIAL PRIMARY KEY, + title VARCHAR NOT NULL, + body TEXT NOT NULL, + published BOOLEAN NOT NULL DEFAULT FALSE +) \ No newline at end of file diff --git a/examples/embedded_async_diesel_r2d2/src/main.rs b/examples/embedded_async_diesel_r2d2/src/main.rs index a179b88..eb600a6 100644 --- a/examples/embedded_async_diesel_r2d2/src/main.rs +++ b/examples/embedded_async_diesel_r2d2/src/main.rs @@ -3,29 +3,47 @@ use diesel::r2d2::{ConnectionManager, Pool}; use diesel::PgConnection; +use diesel_migrations::{embed_migrations, EmbeddedMigrations, MigrationHarness}; use postgresql_embedded::{PostgreSQL, Result, Settings, VersionReq}; +mod models; +pub mod schema; +use self::models::*; +use diesel::prelude::*; + +const MIGRATIONS: EmbeddedMigrations = embed_migrations!("./migrations/"); #[tokio::main] async fn main() -> Result<()> { let settings = Settings { version: VersionReq::parse("=16.4.0")?, + username: "postgres".to_string(), + password: "postgres".to_string(), ..Default::default() }; let mut postgresql = PostgreSQL::new(settings); postgresql.setup().await?; postgresql.start().await?; - let database_name = "test"; + let database_name = "diesel_demo"; postgresql.create_database(database_name).await?; postgresql.database_exists(database_name).await?; { let database_url = postgresql.settings().url(database_name); let manager = ConnectionManager::::new(database_url); - let _pool = Pool::builder() + let pool = Pool::builder() .test_on_check_out(true) .build(manager) .expect("Could not build connection pool"); + let mut mig_run = pool.clone().get().unwrap(); + mig_run.run_pending_migrations(MIGRATIONS).unwrap(); + + let post = create_post( + &mut pool.get().unwrap(), + "My First Post", + "This is my firs post", + ); + println!("Post '{}' created", post.title); } postgresql.drop_database(database_name).await?; @@ -33,6 +51,18 @@ async fn main() -> Result<()> { postgresql.stop().await } +pub fn create_post(conn: &mut PgConnection, title: &str, body: &str) -> Post { + use crate::schema::posts; + + let new_post = NewPost { title, body }; + + diesel::insert_into(posts::table) + .values(&new_post) + .returning(Post::as_returning()) + .get_result(conn) + .expect("Error saving new post") +} + #[cfg(test)] mod test { use super::*; diff --git a/examples/embedded_async_diesel_r2d2/src/models.rs b/examples/embedded_async_diesel_r2d2/src/models.rs new file mode 100644 index 0000000..0079fb2 --- /dev/null +++ b/examples/embedded_async_diesel_r2d2/src/models.rs @@ -0,0 +1,18 @@ +use diesel::prelude::*; + +#[derive(Queryable, Selectable)] +#[diesel(table_name = crate::schema::posts)] +#[diesel(check_for_backend(diesel::pg::Pg))] +pub struct Post { + pub id: i32, + pub title: String, + pub body: String, + pub published: bool, +} + +#[derive(Insertable)] +#[diesel(table_name = crate::schema::posts)] +pub struct NewPost<'a> { + pub title: &'a str, + pub body: &'a str, +} diff --git a/examples/embedded_async_diesel_r2d2/src/schema.rs b/examples/embedded_async_diesel_r2d2/src/schema.rs new file mode 100644 index 0000000..a007b36 --- /dev/null +++ b/examples/embedded_async_diesel_r2d2/src/schema.rs @@ -0,0 +1,8 @@ +diesel::table! { + posts (id) { + id -> Int4, + title -> Varchar, + body -> Text, + published -> Bool, + } +}