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がどういうものかは理解した。