NimでMySQL接続 (あんま怖くないNim③)


NimでC/C++のライブラリを呼び出す。

スクリプト言語風の簡易な文法ながら、C/C++等にコンパイルされ、Cに近しい実行速度が出せるNim。
まだ、バージョン1.0前でドキュメント量をまだまだ少ないため、実案件で使うことは当面ないだろうが、C系との近しさは、余計な物がなん分、C系のライブラリの学習用途には使えそう。

Nimの情報はまだまだ少ないので、MySQL(Mariadb)をNimから呼び出してみたメモ書きをさらしておく。

バッケージマネージャツールnimbleを活用。

外部パッケージを活用して、一定程度以上に複雑なプログラムを書く場合には,適切なパッケージ管理が必要。nimには、パッケージの導入からコードのビルドまでを行えるパッケージマネージャnimbleが標準で付属している。

 mimleでdbライブラリを導入

  • パッケージ情報を最新に更新

    nimble refresh

  • mysqlに関するパッケージ情報を調べる

    nimble search mysql

  • パッケージdbを導入

    nimble install db

これで、RDB接続用パッケージdbが導入される。

nimble initでディレクトリ構造を決定

nimble initコマンドで生成されるパッケージ名.nimbleファイルにより、ディレクトリ構造を定める

パッケージ名.nimble
# Package

version       = "0.1.0"
author        = "Anonymous"
description   = "test"
license       = "MIT"

# Dependencies

requires "nim >= 0.15.2"

# ここにディレクトリ構造を追記  
srcDir = "src"
binDir = "bin"
bin = @["main"]

私もnim初心者なので、委細はnimble initで自ら調べていきたいが
./srcにソースコードを書き、ビルド後のファイルは./binに置かれることは分かるだろう。

MySQLに接続

ローカルのMySqlに接続するには、以下のようなコードを書く(この例ではデーブル生成のみ)。

main.nim
import db_mysql

let theDb = open("localhost", "user", "passwd", "mydb")

theDb.exec(
  sql(
    "create table myTestTbl (" &
    " Id    INT(11)     NOT NULL AUTO_INCREMENT PRIMARY KEY, " &
    " Name  VARCHAR(50) NOT NULL, " &
    " i     INT(11), " &
    " f     DECIMAL(18,10))"
  )
)        

theDb.close()

要するに、open -> exec(sql文) -> closeという一連の流れでデータベースを操作するわけだ。
ビルドはnimble buildで行い、実行は./bin/main.exeとなる。

...が、このまま実行してしまうと、libmysql.dllがないよ、と怒られてしまう(windows環境の場合)。実行に際しては、例えば、windowsでのC言語実行の基本にもどって、libmysql.dllをmain.exeと同じディレクトリに配置する必要がある。

無事実行できた際のディレクトリ構造は以下のようになる。

コンパイル後に生成される./nimcacheディレクトリを開いてみる。

確かに、nimがCにコンパイルされていることが分かる。

C系言語の資産を活かそう。

C系言語は、40年以上の歴史を持ち、さまざまな実用プログラムを生み出してきた。C系言語のソースコードにコンパイルされるnimは、まさしく、その巨人の肩に直接に乗っている形だ。

nimでC系言語の良さをお手軽に再認識したいと思う今日このごろ。