Open3

sqlxでSQLiteを操作する

spargelspargel

sqlx:https://docs.rs/sqlx/latest/sqlx/index.html#

Cargo.toml
[package]
name = "database"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
dotenv = "0.15.0"
sqlx = { version = "0.7.2", features = ["runtime-tokio", "sqlite"] }
tokio = { version = "1.33.0", features = ["full"] }

.env
DATABASE_URL=sqlite:./db/database.db
spargelspargel

SQLiteのデータベースを作成する.
作成されるのは.envに記載されている./db/database.db

main.rs
use dotenv;
use sqlx::{Sqlite, migrate::MigrateDatabase};

#[tokio::main]
async fn main() {
    Sqlite::create_database(&dotenv::var("DATABASE_URL").unwrap()).await.unwrap();
}
spargelspargel

テーブルの作成をsqlx::query()で行う.

main.rs
    // データベースに接続する.
    let pool = sqlx::sqlite::SqlitePool::connect(&dotenv::var("DATABASE_URL").unwrap()).await?;
    // IF NOT EXISTSで既に存在している場合は作成しない.
    let _f = sqlx::query("CREATE TABLE IF NOT EXISTS tablename (id,hoge,fuga)").execute(&pool).await;

同様にSQLを記述できるmacrosqlx::query!()があるが,これを使用すると,事前にエラーチェックが行われるので,データベースが存在しないときにコンパイルエラーとなる.
通常はコンパイルエラーでよいが,今回は一度の実行でデータベースそのものの作成とテーブルの作成を行うので,エラーが起こると困る.