WindowsでNimからMySQLにアクセスする


こちらのMySQL版です。
WindowsでNimからMySQLへのアクセスは問題ないだろうと思っていましたが、libmysql.dllを探す旅路がありました。

import db_mysql

let db = open("localhost","user","password","mysql")
# 安定のメッセージ
could not load: (libmysql.dll|libmariadb.dll)

結局のところ、MySQLの何をダウンロードすればよいのか?

https://dev.mysql.com/downloads/ にはいくつかの選択肢がありますが、MySQL Community ServerのZip Archiveをダウンロードします。

ダウンロードしたZipファイルを解凍すると2箇所にDLLが入っています。
* libフォルダにlibmysql.dll本体
* binフォルダにlibmysql.dllが参照しているlibssl-1_1_x64.dlllibcripto-1_1-x64.dllなどの関連DLL群

思わぬ伏兵

上記のZipを解凍したファイルからDLLを抽出(もしくはパスを通して)して、nimでコンパイルをかけても、libmysql.dllが無いよと言われます。
Dependency Walkerで調べると見つからないDLL(vcruntime140_1.dll)があるようで、このファイルを調べてみるとMicrosoft Visutal C++のラインタイムに含まれているようなので、こちらをインストールします。

解決された依存関係

まとめ的な何か

MySQLもインストーラがあるから簡単にアクセスできるだろうと思っていたのですが、なかなかに面倒でした。

  • Community ServerのZipアーカイバをダウンロードし、DLLをかき集める
  • VisualStudio2019の再配布可能パッケージをダウンロードし、インストールする

サンプルコード

import db_mysql

const host_port = "localhost:13306"
const user_name = "docker"
const password  = "docker"
const database  = "test_database"

block:
  let db = open(host_port,user_name,password,database)
  echo "opened"
  defer:
    db.close()
    echo "closed"
  for x in db.fastRows(sql"SELECT database()"):
    echo x

実行結果

opened
@["test_database"]
closed