今回は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
を指定する事で呼び出せました。