データベースを使用できるようにします。
テキストではSQLiteをr2d2を使用してアクセスしているようです。
関連するクレートを追加します。
[package]
name = "todo"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
actix-web = { version = "4.1" }
actix-rt = { version = "2.7" }
thiserror = { version = "1.0" }
askama = { version = "0.11" }
rusqlite = { version = "0.28", features=["bundled"] }
r2d2 = { version = "0.8" }
r2d2_sqlite = { version = "0.21" }
これをプログラム起動時に、データベースを作成するように修正します。
use r2d2::Pool;
use r2d2_sqlite::SqliteConnectionManager;
use rusqlite::params;
#[actix_rt::main]
async fn main() -> Result<(), actix_web::Error> {
let manager = SqliteConnectionManager::file("todo.db");
let pool = Pool::new(manager).expect("Failed to inithialize the connection pool.");
let conn = pool.get().expect("Failed to get the connection from the pool.");
conn.execute(
"CREATE TABLE IF NOT EXISTS todo (
id INTEGER PRIMARY KEY AUTOINCREMENT,
text TEXT NOT NULL
)",
params![],
)
.expect("Failed to create a table 'todo'.");
HttpServer::new(move || App::new().service(index).app_data(pool.clone()))
.bind("0.0.0.0:8080")?
.run()
.await?;
Ok(())
}
マネージャーを作成し、プールを作成し、データベースを作成するSQLを実行しています。
さらに、App::new()にプールを使用するようにデータを渡しています。
テキストではdata(pool.clone())を使用していましたが、
ワーニングが出るので、調べたところ、
推奨されていない処理なので、app_dataを使え、と言うことでした。
使用しているテキスト