Rust - データベースアクセス

 クラウディア
1. 概要
2. 準備
3. パッケージ作成
4. crate を使う
5. 実行

1. 概要

 「Rust」をさわり始めて、4日目かな。  データベースへアクセスしてみようと思います。  わはは、無謀じゃろか?  本ページは、下記のサイトを参考にさせていただきました。
Rust で PostgreSQL に接続する」
「postgres - crates.io: Rust Package Registry
 データベース関係のサンプルコードは、あちこちにあるんじゃけど。  「Rust Cookbook」を含めて、わたしがビルドすると、ことごとくエラーになるのです。  あれこれ試行錯誤して、最後にやっと成功しそうなのが、上のサイトです。

2. 準備

 データベースは、既存の「postgreSQL」のものを持っています。  データベース名は「COLLEGE」とつけています。  ちょうどサンプルに使えそうなテーブルがあります。

CREATE TABLE IF NOT EXISTS PUBLIC.PREF
(
    CODE CHARACTER(2)  NOT NULL,
    NAME CHARACTER VARYING(16)
);
 で作成したテーブル(あれ?「INDEX」がねぇな)。  47都道府県の県コードと名称がはいっています(「都道府県コード」)。  中身は

01 北海道
02 青森県
03 岩手県

・・・	以下略	・・・
 で設定済。

3. パッケージ作成

 まず、パッケージのみを作成します。

cargo new --vcs=none postgres
 ソースを下記のように書きました。

extern crate postgres;
use postgres::{Client, Error, NoTls};

fn main() -> Result<(), Error>
{
    let mut client = Client::connect("postgresql://postgres:password@127.0.0.1:5432/college", NoTls, )?;

    for row in client.query("SELECT code, name FROM pref", &[])?
	{
        let code: String = row.get(0);
        let name: String = row.get(1);
        println!("{} {}", code, name);
    }

    Ok(())
}
 いきなり、ビルドしようとしたら

kitayama@ns.sing.ne.jp /home/hogehoge/lang/rust/database/postgres > cargo build
   Compiling postgres v0.1.0 (/パス/postgres)
error[E0463]: can't find crate for `postgres`
 --> src/main.rs:1:1
  |
1 | extern crate postgres;
  | ^^^^^^^^^^^^^^^^^^^^^^ can't find crate

For more information about this error, try `rustc --explain E0463`.
error: could not compile `postgres` due to previous error

4. crate を使う

 そう、いきなり、1行目の

extern crate postgres;
 でエラーになるわけです。  そうね、「crate(クレート)」ちゅうもんの扱い方を知らんのよ。  いままで、標準で用意されている、関数しか、使っちょらんからね。  「crate」ちゅうのは、ライブラリみたいなもん(ずばり、ライブラリそのもの?)と理解しております。  これをインストールするんだかどうだかしなきゃ、ライブラリが使えんわけですよ。  他の言語なら「pip」なり「phpcomposer」「cpan」「gem」なりがあって、それでインストールするんですが・・・。  これが見つからん。  ドキュメントの読み方が悪いんか、あっちが不親切なんかわかりませんが、まぁおそらくは、わたしが馬鹿者なんでしょうな。  小一時間以上かかりました。  やっとわかったのが、「Cargo.toml」を編集するちゅうこと。  デフォルトで、この時点で下記のようになっちょるものの

[package]
name = "postgres"
version = "0.1.0"
edition = "2021"

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

[dependencies]
 末尾の「[dependencies]」の行の後ろに行を追加します。  それは、「postgres」であれば、「Crate.io」の「postgres」を紹介している
postgres - crates.io: Rust Package Registry
 に
「Rust」-「postgres - crates.io: Rust Package Registry」

 ちゅうて書いてありました。
 わたしの目が節穴だったわけです。
 すなわち


[dependencies]
postgres = "0.19.3"
 と書くわけです。  するとビルドが通るようになります。

$ cargo build
    Updating crates.io index
   Compiling cfg-if v1.0.0
   Compiling libc v0.2.126
   Compiling autocfg v1.1.0

・・・	略	・・・

   Compiling tokio-postgres v0.7.6
   Compiling postgres v0.19.3
   Compiling postgres v0.1.0 (/usr/home/hogehoge/lang/rust/database/postgres)
    Finished dev [unoptimized + debuginfo] target(s) in 1m 12s
 これ、「postgres」の「crate」が依存するものが全部ダウンロードされるので、初回はめちゃくちゃ時間がかかります。  2回目以降は、更新がなければ、コンパイルのみのようです。  「crate.io」からダウンロードした実物は

~/.cargo/registry/src
 へインストールされるようです。

5. 実行

 で、実行すると

01 北海道
02 青森県
03 岩手県

・・・	略	・・・

45 宮崎県
46 鹿児島県
47 沖縄県
 わはは、でけた。
earthcar(アースカー)