diesel installed with example to create and list users

This commit is contained in:
2023-10-09 00:52:37 +02:00
parent 22ea7cab3d
commit e6dba30f48
13 changed files with 153 additions and 52 deletions

39
src/bin/create_user.rs Normal file
View File

@@ -0,0 +1,39 @@
use diesel::pg::PgConnection;
use diesel::prelude::*;
use dotenvy::dotenv;
use miniweb::users::models::{NewUser, User};
use std::env;
use std::io::stdin;
pub fn establish_connection() -> PgConnection {
dotenv().ok();
let database_url = env::var("DATABASE_URL").expect("DATABASE_URL must be set");
PgConnection::establish(&database_url)
.unwrap_or_else(|_| panic!("Error connecting to {}", database_url))
}
pub fn create_user(conn: &mut PgConnection, username: &str) -> User {
use miniweb::schema::users;
let new_user = NewUser { username };
diesel::insert_into(users::table)
.values(&new_user)
.returning(User::as_returning())
.get_result(conn)
.expect("Error saving new user")
}
fn main() {
let connection = &mut establish_connection();
let mut username = String::new();
println!("Enter username for new user:");
stdin().read_line(&mut username).unwrap();
let username = username.trim_end(); // Remove the trailing newline
let user = create_user(connection, username);
println!("\nSaved user {} with id {}", username, user.id);
}

29
src/bin/list_users.rs Normal file
View File

@@ -0,0 +1,29 @@
use diesel::pg::PgConnection;
use diesel::prelude::*;
use dotenvy::dotenv;
use miniweb::schema::users::dsl::*;
use miniweb::users::models::User;
use std::env;
pub fn establish_connection() -> PgConnection {
dotenv().ok();
let database_url = env::var("DATABASE_URL").expect("DATABASE_URL must be set");
PgConnection::establish(&database_url)
.unwrap_or_else(|_| panic!("Error connecting to {}", database_url))
}
fn main() {
let connection = &mut establish_connection();
let results = users
.select(User::as_select())
.load(connection)
.expect("Error loading posts");
println!("Displaying {} users", results.len());
for user in results {
println!("{}", user.username);
}
println!("-----------\n");
}

View File

@@ -1,2 +1,4 @@
pub mod schema;
pub mod service;
pub mod state;
pub mod users;

8
src/schema.rs Normal file
View File

@@ -0,0 +1,8 @@
// @generated automatically by Diesel CLI.
diesel::table! {
users (id) {
id -> Int4,
username -> Varchar,
}
}

1
src/users/mod.rs Normal file
View File

@@ -0,0 +1 @@
pub mod models;

15
src/users/models.rs Normal file
View File

@@ -0,0 +1,15 @@
use diesel::prelude::*;
#[derive(Queryable, Selectable)]
#[diesel(table_name = crate::schema::users)]
#[diesel(check_for_backend(diesel::pg::Pg))]
pub struct User {
pub id: i32,
pub username: String,
}
#[derive(Insertable)]
#[diesel(table_name = crate::schema::users)]
pub struct NewUser<'a> {
pub username: &'a str,
}