👋

KottiのデータをSeaORMで取り出す

2023/11/18に公開

Kotti (https://github.com/Kotti/Kotti) というPythonによるCMSを以前使っていたが使わなくなったのでデータだけを取り出したくなった。
データはSQLiteで保存していた。これをRustで取り出すこととして,SeaORMを使ってみることにした。
今回はSeaORM CLIというツールで既存のテーブルからコードを生成した。

コード生成

まずは SeaORM CLIのインストール。

cargo install sea-orm-cli

cargo initでプロジェクトを作るあたりは省略。

Cargo.tomlsea-ormを使うように指定。featuresでいくつか必要なものを追加。

[dependencies]
sea-orm = { version = "0.12.6", features = ["sqlx-sqlite", "runtime-tokio-rustls", "macros"] }
tokio = { version = "1.34.0", features = ["full"] }

sea-orm-cliを実行する。以下にようにすればsrc/entities以下にコードが生成される。

sea-orm-cli generate entity -u sqlite:///path/to/Kotti.db -o src/entities

main.rsを雑に書いてどんなものか様子を見ようとする。

use std::error::Error;

mod entities;

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
    Ok(())
}

これでOK…とはならない。実際cargo buildを実行すると以下のようなエラーになる。

error: Entity must have a primary key column. See <https://github.com/SeaQL/sea-orm/issues/485> for details.
 --> src/entities/kotti_alembic_version.rs:5:35
  |
5 | #[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)]
  |                                   ^^^^^^^^^^^^^^^^^
  |
  = note: this error originates in the derive macro `DeriveEntityModel` (in Nightly builds, run with -Z macro-backtrace **for more info)

SeaORMはPrimary Keyがないテーブルにまだ対応してないらしい。
そこをなんとかする…ということは今回はやらない。
このテーブルのデータは必要ないのでファイル毎消してしまうことにする。
するとコンパイルは通るようになる。

ちょっとデータベースから実際にデータを取ってくる。

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
    let url = "sqlite:///home/takaki/var/Kotti.db";
    let conn = Database::connect(url).await?;

    let node = Nodes::find_by_id(1).one(&conn).await?.unwrap();
    println!("{:?}", node);
    let nodes = Nodes::find().all(&conn).await?;
    nodes.iter().for_each(|n| {
        println!("{:?}", n);
    });

    Ok(())
}

こんな感じであとは頑張る。

GitHubで編集を提案

Discussion