#![cfg(feature = "sqlx_sqlite")]
use chain_builder::{IntoBind, QueryBuilder, Sqlite, Value};
#[derive(Debug, sqlx::FromRow, PartialEq)]
struct User {
id: i64,
name: String,
}
fn row(pairs: Vec<(&str, Value)>) -> Vec<(&str, Value)> {
pairs
}
#[tokio::test]
async fn sqlite_round_trip() {
let pool = sqlx::SqlitePool::connect("sqlite::memory:").await.unwrap();
sqlx::query("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT NOT NULL, age INTEGER)")
.execute(&pool)
.await
.unwrap();
QueryBuilder::<Sqlite>::table("users")
.insert(row(vec![
("id", 1i64.into_bind()),
("name", "Ann".into_bind()),
("age", 30i64.into_bind()),
]))
.execute(&pool)
.await
.unwrap();
let rows: Vec<User> = QueryBuilder::<Sqlite>::table("users")
.select(["id", "name"])
.order_by_asc("id")
.fetch_all(&pool)
.await
.unwrap();
assert_eq!(
rows,
vec![User {
id: 1,
name: "Ann".into()
}]
);
let n: i64 = QueryBuilder::<Sqlite>::table("users")
.count(&pool)
.await
.unwrap();
assert_eq!(n, 1);
}
#[tokio::test]
async fn sqlite_upsert_and_returning() {
let pool = sqlx::SqlitePool::connect("sqlite::memory:").await.unwrap();
sqlx::query("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT NOT NULL)")
.execute(&pool)
.await
.unwrap();
let returned: Vec<(i64,)> = QueryBuilder::<Sqlite>::table("users")
.insert(row(vec![
("id", 1i64.into_bind()),
("name", "Ann".into_bind()),
]))
.returning(["id"])
.fetch_all(&pool)
.await
.unwrap();
assert_eq!(returned, vec![(1,)]);
let conflicted: Vec<(i64,)> = QueryBuilder::<Sqlite>::table("users")
.insert(row(vec![
("id", 1i64.into_bind()),
("name", "Bob".into_bind()),
]))
.on_conflict_do_nothing(["id"])
.returning(["id"])
.fetch_all(&pool)
.await
.unwrap();
assert!(conflicted.is_empty());
let rows: Vec<User> = QueryBuilder::<Sqlite>::table("users")
.select(["id", "name"])
.order_by_asc("id")
.fetch_all(&pool)
.await
.unwrap();
assert_eq!(
rows,
vec![User {
id: 1,
name: "Ann".into()
}]
);
}