use diesel::prelude::*;
use diesel_libsql::LibSqlConnection;
diesel::table! {
users (id) {
id -> Integer,
name -> Text,
}
}
fn main() {
let mut conn = LibSqlConnection::establish(":memory:").expect("Failed to connect");
diesel::sql_query(
"CREATE TABLE users (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL)",
)
.execute(&mut conn)
.expect("Failed to create table");
diesel::sql_query("INSERT INTO users (name) VALUES ('alice')")
.execute(&mut conn)
.expect("Failed to insert alice");
diesel::sql_query("INSERT INTO users (name) VALUES ('bob')")
.execute(&mut conn)
.expect("Failed to insert bob");
let results: Vec<(i32, String)> = users::table
.select((users::id, users::name))
.load(&mut conn)
.expect("Failed to query users");
println!("All users:");
for (id, name) in &results {
println!(" id={}, name={}", id, name);
}
diesel::update(users::table.filter(users::name.eq("alice")))
.set(users::name.eq("alice_updated"))
.execute(&mut conn)
.expect("Failed to update");
diesel::delete(users::table.filter(users::name.eq("bob")))
.execute(&mut conn)
.expect("Failed to delete");
let results: Vec<(i32, String)> = users::table
.select((users::id, users::name))
.load(&mut conn)
.expect("Failed to query users");
println!("\nAfter update and delete:");
for (id, name) in &results {
println!(" id={}, name={}", id, name);
}
let tx_result: Result<(), diesel::result::Error> = conn
.transaction::<_, diesel::result::Error, _>(|conn| {
diesel::sql_query("INSERT INTO users (name) VALUES ('charlie')")
.execute(conn)
.expect("Failed to insert in tx");
println!("\nInside transaction: inserted charlie");
Ok(())
});
tx_result.expect("Transaction failed");
let results: Vec<(i32, String)> = users::table
.select((users::id, users::name))
.load(&mut conn)
.expect("Failed to query users");
println!("\nFinal state:");
for (id, name) in &results {
println!(" id={}, name={}", id, name);
}
}