use anyhow::Error;
use postgres_query::{query, FromSqlRow};
use structopt::StructOpt;
use tokio_postgres::{config::Config, NoTls};
#[derive(StructOpt)]
struct Options {
config: Vec<String>,
}
#[derive(FromSqlRow)]
struct Person {
name: String,
age: i32,
}
#[tokio::main]
async fn main() -> Result<(), Error> {
let options = Options::from_args();
let config: Config = options.config.join(" ").parse()?;
let (mut client, connection) = config.connect(NoTls).await?;
tokio::spawn(async move {
if let Err(e) = connection.await {
eprintln!("connection error: {}", e);
}
});
let tx = client.transaction().await?;
query!("CREATE TABLE people (name TEXT, age INT)")
.execute(&tx)
.await?;
query!(
"INSERT INTO people VALUES ($name, $age)",
name = "John Wick",
age = 42,
)
.execute(&tx)
.await?;
let query = query!("SELECT name, age FROM people");
let people: Vec<Person> = query.fetch(&tx).await?;
for person in people {
println!("{} is {} years young", person.name, person.age);
}
tx.rollback().await?;
Ok(())
}