今回はEmacSQLというサードパーティ製のライブラリを使ってMySQLに接続してクエリを実行してみます。

emacsql?emacsql-mysql?

emacsqlは抽象度の高いEmacs Lispのデータベースクライアントのフロントエンドです。MySQL、PostgreSQL、SQLiteをサポートしていますが、eamcsqlにはそれらの実装が全て入っているわけではありません。emacsql-mysqlはEmacSQLのMySQL用バックエンドでありemacsqlに依存しています。

インストール

M-x package-install RET emacsql-mysql RET もしくは以下でパッケージをインストールします。

(package-install 'emacsql-mysql)

emacsqlはemacsql-mysqlの依存性によりインストールされます。

MySQLへの接続情報

今回使用するデータベースの情報です。 CREATE DATABASE はすでにしてあるものとします。

説明
ホスト 127.0.0.1
ポート番号 3306
ユーザー person_local
パスワード local12345
データベース名 person_local

データベースへの接続

データベースと接続するためにはemacsql-mysqlを使います。

(setq person-db (emacsql-mysql "person_local" 
                               :user "person_local"
                               :password "local12345"
                               :host "127.0.0.1"
                               :port "3306"
                               :debug t))

接続が成功するとemacsql-mysql-connectionが返されます。また *emacsql-mysql* というバッファが作成されます。これは結果を一時的に書き込むバッファです。

SQLの実行

emacsqlを使って簡単なSQLを実行してみます。第一引数には接続時に返却されたemacsql-mysql-connectionを渡します。第二引数にはSQLの文字列、またはSQLに変換可能なEmacs Lispオブジェクトを渡します。

(emacsql person-db "SELECT * FROM person")
8 [email protected] 2019-05-27 05:06:39 55714c760e65c15860675a459f192876
9 [email protected] 2019-05-27 05:08:54 55714c760e65c15860675a459f192876

データベースから返された結果は *emacsql-mysql* というバッファに一時的に書き込まれ、emacsql-parseによってEmacs Lispオブジェクトに変換されて返されます。

文字列ではなくEmacs Lispオブジェクトを渡す

emacsqlの第二引数にはSQLに変換可能なEmacs Lispオブジェクトも渡すことができます。

(emacsql person-db [:SELECT * :FROM person])
8 [email protected] 2019-05-27 05:06:39 55714c760e65c15860675a459f192876
9 [email protected] 2019-05-27 05:08:54 55714c760e65c15860675a459f192876

Emacs LispオブジェクトからSQL文字列への変換

emacsql関数の第二引数は文字列だけではなくEmacs Lispオブジェクトも渡すことができました。それはemacsql-compileによってEmacs Lispオブジェクトから文字列(SQL)に変換しているからです。emacsql-compileを直接使うことでどのようなSQLに変換されるのかを確かめることができます。

(emacsql-compile connection '(:select 1))
"SELECT 1;"

ストアドプロシージャーの呼び出し

ストアドプロシージャーも呼び出せる事を確認してみます。まず以下のようなストアドプロシージャーを定義します。

DELIMITER //
DROP PROCEDURE IF EXISTS TESTING;
CREATE PROCEDURE TESTING ()
BEGIN
    SELECT * FROM person;
END
//
DELIMITER ;

ではTESTINGを呼び出してみましょう。

(emacsql person-db [:CALL TESTING])
8 [email protected] 2019-05-27 05:06:39 55714c760e65c15860675a459f192876
9 [email protected] 2019-05-27 05:08:54 55714c760e65c15860675a459f192876

正しく呼び出せています。

まとめ

EmacSQLを使ってMySQLに接続しクエリーの実行を確認しました。emacsql-mysqlを使って接続、emacsqlを使ってクエリの実行ができました。emacsql-compleを使う事でEmacs LispオブジェクトがどのようなSQLに変換されるのかを確認しました。ストアドプロシージャーもSQLと同じように :CALL を指定する事で呼び出せました。