Ch.11 SML#の拡張機能:SQLのシームレスな統合

§ 11.4. データベース問い合わせ実行例

以上の構文を使いデータベースの問い合わせを行なってみましょう. SML#の通常のインストールでは,データベースサーバは PostgreSQLと接続するように設定されています. データベースをアクセスするためには,PostgreSQLサーバをインストー ルし起動しておく必要があります.

まず以下の手順で,PostgreSQLサーバでデータベースを構築しましょう. 以下に簡単な手順を示します. 詳しくはPostgreSQLドキュメントを参照してください.

  1. PostgreSQLサーバを起動します. 例えばpg_ctl start -D /usr/local/pgsql/data ようにすると起動できるはずです.

  2. コマンドラインでcreateuser myAccountを実行しPostgreSQL のユーザのロールを作成する. myAccountは,使用するユーザの名前です.

  3. コマンドラインでcreatedb mydbを実行しデータベースを作成する.

  4. SQL言語インタープリタを起動し,データベースの中にテーブルを作成す る. 例えば,第11.1節の例のデータベースは,以下 のようにすれば作成できます.

    $ psql
    mydb# CREATE TABLE Persons (
        name text not null, age int not null, salary int not null   );
    mydb# INSERT INTO Persons VALUES ('Joe', 21, 10000);
    mydb# INSERT INTO Persons VALUES ('Sue', 31, 20000);
    mydb# INSERT INTO Persons VALUES ('Bob', 41, 30000);

自分のアカウント(ここではmyAccount)に戻り,データベース にアクセスできるか確認してみましょう. 以下のような結果が得られれば,成功です.

$ psql mydb;

mydb=# SELECT * FROM Persons;
name | age | salary
------+-----+--------
Joe | 21 | 10000
Sue | 31 | 20000
Bob | 41 | 20000
(3 行)

ではいよいよ,このデータベースをSML#からアクセスしてみま しょう. 第11.2節で定義した問い合わせ関数をmyQueryとします. 対話型セッションで以下のような結果が得られるはずです.

$ smlsharp;
# val myServer = _sqlserver "dbname=mydb" : {Persons:{name:string, age:int, salary :int};
val myServer = _ : {Persons: {age: int, name: string, salary: int}} server
# val conn = SQL.connet myServer;
val conn = _ : {Persons: {age: int, name: string, salary: int}} conn
# val rel = _sqleval myQuery conn;
val rel = {Persons: {age: int, name: string, salary: int}} rel
# SQL.fetchAll rel;
val it = {{age=32, name="Sue"}, {age=41, name="Bob"}} : {age:int, name: string} list