use prqlx::{query, query_as};
use sqlx::{migrate::MigrateDatabase, Sqlite, SqlitePool};
const DB_URL: &str = "sqlite://sqlite.db";
async fn setup_db() -> SqlitePool {
if !Sqlite::database_exists(DB_URL).await.unwrap_or(false) {
println!("Creating database {}", DB_URL);
Sqlite::create_database(DB_URL).await.unwrap()
} else {
println!("Database already exists");
}
let pool = SqlitePool::connect(DB_URL).await.unwrap();
sqlx::query("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY NOT NULL, name VARCHAR(250) NOT NULL);")
.execute(&pool)
.await
.unwrap();
sqlx::query("INSERT OR IGNORE INTO users (id, name) VALUES (123, 'John Doe');")
.execute(&pool)
.await
.unwrap();
pool
}
#[tokio::test]
async fn test_query() {
let pool = setup_db().await;
let val = query!(
"
from users
select { id, name }
"
)
.fetch_all(&pool)
.await
.unwrap();
println!("{:?}", val);
}
#[derive(Debug)]
#[allow(dead_code)]
struct User {
id: i64,
name: String,
}
#[tokio::test]
async fn test_query_as() {
let pool = setup_db().await;
let val = query_as!(
User,
"
from users
select { id, name }
"
)
.fetch_all(&pool)
.await
.unwrap();
assert_eq!(val[0].name, "John Doe");
}
#[tokio::test]
async fn test_query_with_args() {
let pool = setup_db().await;
let user_id = 123i64;
let val = query_as!(
User,
"
from users
select { id, name }
filter id == $1
",
user_id
)
.fetch_one(&pool)
.await
.unwrap();
assert_eq!(val.name, "John Doe");
}