1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//! SQLite の接続プールを作る
use anyhow::Context;
use sqlx::SqlitePool;
use sqlx::sqlite::{SqliteConnectOptions, SqliteJournalMode, SqlitePoolOptions};
use std::str::FromStr;
/// 接続プールを作る。表の用意は使う側と [`crate::session::prepare`] が行う
pub async fn connect(url: &str) -> anyhow::Result<SqlitePool> {
// WAL にしないと、書き込みのあいだ読み込みまで止まる。sqlx は既定でここを触らない
let options = SqliteConnectOptions::from_str(url)
.with_context(|| format!("DATABASE_URL={url} を SQLite の場所として読めません"))?
.create_if_missing(true)
.journal_mode(SqliteJournalMode::Wal);
SqlitePoolOptions::new()
.max_connections(8)
.connect_with(options)
.await
.with_context(|| format!("SQLite につながりません: {url}"))
}