2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

NimAdvent Calendar 2020

Day 13

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

Last updated at Posted at 2020-12-12

こちらの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をダウンロードします。

2020-11-26_09h38_55.png

ダウンロードしたZipファイルを解凍すると2箇所にDLLが入っています。

  • libフォルダにlibmysql.dll本体
  • binフォルダにlibmysql.dllが参照しているlibssl-1_1_x64.dlllibcripto-1_1-x64.dllなどの関連DLL群

image.png

思わぬ伏兵

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

image.png

解決された依存関係

2020-11-26_09h57_45.png

まとめ的な何か

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
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?