tokio-postgres-migrationを使用します。
https://crates.io/crates/tokio-postgres-migration
Cargo.toml
tokio-postgres-migration = "0.1.0"
./asset/0001-create-table-books-up.sql
CREATE TABLE books (
id integer PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
name varchar(10),
body text NOT NULL
);
use tokio_postgres_migration::Migration;
//
const SCRIPTS_UP: [(&str, &str); 2] = [
(
"0001-create-table-books",
include_str!(".././asset/0001-create-table-books-up.sql"),
),
(
"0002-create-table-pets",
include_str!(".././asset/0002-create-table-pets-up.sql"),
)
];
//
async fn handle_migration() -> impl IntoResponse {
let _ = create_table().await;
(StatusCode::OK, format!("Migration completed"))
}
async fn psql_connect() -> Result<Client, Box<dyn std::error::Error>> {
let (client, connection) = tokio_postgres::connect("host=localhost user=postgres password=hogehoge", NoTls).await?;
tokio::spawn(async move {
if let Err(e) = connection.await {
eprintln!("connection error: {}", e);
}
});
Ok(client)
}
async fn create_table() -> Result<(), Box<dyn std::error::Error>> {
let mut client = psql_connect().await.unwrap();
let migration = Migration::new("table_to_keep_migrations".to_string());
migration.up(&mut client, &SCRIPTS_UP).await?;
Ok(())
}
これだと、booksとpetsは作られるんだけど、Migration::new(“${table_name}”)のtable_nameもselfで作られてしまうな…
https://github.com/jdrouet/tokio-postgres-migration/blob/main/src/lib.rs
migrationがどういうものかは理解した。