はじめに
D-man botで使われているmysql-dはlibmysqlに依存しています。
今回、読んで字のごとくD言語ネイティブなmysql-nativeに変更するため、基本的な使い方をまとめます。
基本的な使い方
READMEのBasic exampleに書かれています。
import std.variant;
import mysql;
void main(string[] args)
{
// Connect
auto connectionStr = args[1];
Connection conn = new Connection(connectionStr);
scope(exit) conn.close();
// Insert
auto rowsAffected = exec(conn,
"INSERT INTO `tablename` (`id`, `name`) VALUES (1, `Ann`), (2, `Bob`)");
// Query
ResultRange range = query(conn, "SELECT * FROM `tablename`");
Row row = range.front;
Variant id = row[0];
Variant name = row[1];
assert(id == 1);
assert(name == "Ann");
range.popFront();
assert(range.front[0] == 2);
assert(range.front[1] == "Bob");
// Prepared statements
Prepared prepared = prepare(conn, "SELECT * FROM `tablename` WHERE `name`=? OR `name`=?");
prepared.setArgs("Bob", "Bobby");
ResultRange bobs = prepared.query();
bobs.close(); // Skip them
prepared.setArgs("Bob", "Ann");
ResultSet rs = prepared.querySet();
assert(rs.length == 1);
assert(rs[0][0] == 1);
assert(rs[0][1] == "Ann");
assert(rs[1][0] == 2);
assert(rs[1][1] == "Bob");
// Nulls
Prepared insert = prepare(conn, "INSERT INTO `tablename` (`id`, `name`) VALUES (?,?)");
insert.setArgs(null, "Cam"); // Also takes Nullable!T
insert.exec();
range = query(conn, "SELECT * FROM `tablename` WHERE `name`='Cam'");
assert( range.front[0][0].type == typeid(typeof(null)) );
}
// Connect
auto connectionStr = args[1];
Connection conn = new Connection(connectionStr);
scope(exit) conn.close();
例ではconnectionStr
として文字列でMySQLの接続情報を取得しています。"host=localhost;port=3306;user=joe;pwd=pass123;db=myappsdb"
のように;
で値を連結したものを用います。
それ以外にもいくつかのコンストラクタが利用できます。
// Insert
auto rowsAffected = exec(conn,
"INSERT INTO `tablename` (`id`, `name`) VALUES (1, `Ann`), (2, `Bob`)");
exec
で直接SQLを実行します。返り値は変更された行数がulong
で返ります。
// Query
ResultRange range = query(conn, "SELECT * FROM `tablename`");
Row row = range.front;
Variant id = row[0];
Variant name = row[1];
assert(id == 1);
assert(name == "Ann");
range.popFront();
assert(range.front[0] == 2);
assert(range.front[1] == "Bob");
query
はSQLを実行し、結果をResultRange
で返します。
Row
のrange
なので、front
などでRow
として取り出すことができます。
Row
はVariant
で各カラムの値を持ちます。また、toStruct
で構造体に変換できます。
// Prepared statements
Prepared prepared = prepare(conn, "SELECT * FROM `tablename` WHERE `name`=? OR `name`=?");
prepared.setArgs("Bob", "Bobby");
ResultRange bobs = prepared.query();
bobs.close(); // Skip them
prepared.setArgs("Bob", "Ann");
ResultSet rs = prepared.querySet();
assert(rs.length == 1);
assert(rs[0][0] == 1);
assert(rs[0][1] == "Ann");
assert(rs[1][0] == 2);
assert(rs[1][1] == "Bob");
Prepared
でプリペアドステートメントを利用できます。
setArgs
で値をセット、query
はResultRange
、querySet
はResultSet
を返します。
// Nulls
Prepared insert = prepare(conn, "INSERT INTO `tablename` (`id`, `name`) VALUES (?,?)");
insert.setArgs(null, "Cam"); // Also takes Nullable!T
insert.exec();
range = query(conn, "SELECT * FROM `tablename` WHERE `name`='Cam'");
assert( range.front[0][0].type == typeid(typeof(null)) );
null
値の扱いです。
さいごに
コミットしました。
注意
This package supports both Phobos sockets and Vibe.d sockets. Vibe.d support is disabled by default, to avoid unnecessary depencency on Vibe.d. To enable Vibe.d support, use:
(このパッケージはPhobosのソケットとVibe.dのソケット両方をサポートしています。デフォルトでは不必要な依存を避けるためにVibe.dは無効になっていますが、下記で有効にすることができます。)
-version=Have_vibe_d_core
とありますが、DUBのバグのためVibe.dは常に有効になります。