use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use sqlorm::prelude::*;
use sqlorm::sqlx::Executor;
use sqlorm::table;
use uuid::Uuid;
pub async fn create_test_db() -> Pool {
let base_url = "postgres://test:test@localhost:5432/".to_string();
let admin_pool = Pool::connect(&base_url).await.unwrap();
let db_name = format!("test_db_{}", Uuid::new_v4().to_string().replace("-", ""));
admin_pool
.execute(format!(r#"CREATE DATABASE "{}""#, db_name).as_str())
.await
.expect("Failed to create test database");
let mut test_db_url = base_url.clone();
if let Some(idx) = test_db_url.rfind('/') {
test_db_url.replace_range(idx + 1.., &db_name);
}
Pool::connect(&test_db_url)
.await
.expect("Failed to connect to test database")
}
#[table(name = "user")]
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct User {
#[sql(pk)]
pub id: i64,
#[sql(unique)]
pub email: String,
pub username: String,
pub first_name: String,
pub last_name: String,
#[sql(timestamp(created_at, chrono::Utc::now()))]
pub created_at: DateTime<Utc>,
#[sql(timestamp(updated_at, chrono::Utc::now()))]
pub updated_at: DateTime<Utc>,
}
impl User {
pub fn new(email: &str, username: &str, first_name: &str, last_name: &str) -> Self {
Self {
email: email.to_string(),
username: username.to_string(),
first_name: first_name.to_string(),
last_name: last_name.to_string(),
..Default::default()
}
}
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let pool = create_test_db().await;
sqlorm::sqlx::query(
r#"
CREATE TABLE IF NOT EXISTS "user" (
id BIGSERIAL PRIMARY KEY,
email VARCHAR NOT NULL UNIQUE,
username VARCHAR NOT NULL UNIQUE,
first_name VARCHAR NOT NULL,
last_name VARCHAR NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
)
"#,
)
.execute(&pool)
.await?;
println!("Created users table");
let user = User::new("alice@example.com", "alice", "Alice", "Smith")
.save(&pool)
.await?;
println!("Created user: {:?}", user);
let found_user = User::find_by_id(&pool, user.id)
.await?
.expect("User should exist");
println!("Found user by ID: {:?}", found_user);
let mut updated_user = found_user;
updated_user.username = "alice_updated".to_string();
let updated_user = updated_user.save(&pool).await?;
println!("Updated user: {:?}", updated_user);
let users_named_alice = User::query()
.filter(User::FIRST_NAME.eq("Alice".to_string()))
.fetch_all(&pool)
.await?;
println!("Users named Alice: {:?}", users_named_alice);
println!("Basic example completed successfully!");
Ok(())
}