データ型マッピング
データベースを使用する際の最も重要な問題の一つに,データを保管するときとデータベースから取り出すときのデータの変換がある.このチュートリアルでは,データベースに保管されたデータとWolfram言語式のインタラクトについて述べる.
次の表はデータ型とWolfram言語式との間のマッピングを示している.例えばWolfram言語のInteger式は,SQLのINTEGERやTINYINT等の整数型で保存できる.また,VARCHAR型の列のデータを選択すると,これはWolfram言語ではString式となる.
Wolfram言語式 |
データ型
|
| String | ほとんどの場合,CHAR,VARCHAR,LONGVARCHAR等のSQL型で使われる |
| Integer | ほとんどの場合,INTEGER,TINYINT,SMALLINT,BIGINT等のSQL型で使われる |
| Real | ほとんどの場合,DOUBLE,FLOAT,REAL等のSQL型で使われる |
| True | ほとんどの場合SQL型BITで使われる |
| False | ほとんどの場合SQL型BITで使われる |
| Null | ほとんどの場合SQL型NULLで使われる |
| SQLBinary | ほとんどの場合,BINARY,VARBINARY,LONGVARBINARY等のSQL型で使われる |
| SQLDateTime | ほとんどの場合,DATE,TIME,TIMESTAMP等のSQL型で使われる |
| SQLExpr | Wolfram言語式を保管するための特別なバイナリデータ型 |
Wolfram言語式とデータベースに保管されているデータ型のマッピング
String,Integer,Real,True,False,Null等のWolfram言語の原子式,およびSQLBinary,SQLDateTime,SQLExprで形成された複合式は,Javaオブジェクトに変換,またはJavaオブジェクトから変換される.JavaオブジェクトはJDBCドライバで提供されているあらゆるエンコードまたはエスケープ機能を利用して,JDBC操作で処理される.一般にこのようなドライバはクエリに渡す,あるいはクエリから受け取った値のエンコードのための,データベースに特有のコードを含んでいる.これらのドライバはデータベースの製造元により実装されていることも多いので,その機能を最大限利用するとよい.
データ型によっては,Wolfram言語式が特別なラッパーを使わなければならないこともある.例えばデータ型BINARYについては,Wolfram言語式はラッパーSQLBinaryを使用していなければならない.これらのラッパーはコマンドの構成において不明瞭な点を取り除くために必要である.
SQLBinary
SQLBinaryは,データベース中のバイナリデータの操作に使用する.これは画像やコンパイルしたコードの保管に使える.
このセクションの例を実際に試してみて,記載の通りに動作しなかった場合は,「データベースの例の使用」で述べているように"DatabaseLink`DatabaseExamples`"パッケージを使ってデータベースをもとの状態に戻す必要があるかもしれない.
DatabaseLink をロードし,demoデータベースに接続する.
Needs["DatabaseLink`"];
conn = OpenSQLConnection["demo"];gif = ExportString[Plot[Sin[x], {x, 0, 2Pi}], "GIF"]ToCharacterCodeを使って,画像を表すバイトのリストを作る.このリストをSQLBinaryで囲む.
byteData = SQLBinary[ToCharacterCode[gif]];SQLCreateTable[conn, "BINTABLE", {SQLColumn["BINCOL", "DataTypeName" -> "BINARY", "DataLength" -> 2 ^ 16]}]SQLInsert[conn, "BINTABLE", {"BINCOL"}, {byteData}]SQLSelectを使ってデータを取り出す.これはバイナリデータなので,SQLBinary式で返される.
data = SQLSelect[conn, "BINTABLE"];その後,FromCharacterCodeを使ってデータを文字列に戻す.
gifData = FromCharacterCode[ data[[1, 1, 1]] ];Show[ImportString[gifData, "GIF"]]SQLDropTable[conn, "BINTABLE"];
CloseSQLConnection[conn];SQLDateTime
SQLDateTimeは,データベースの日付と時間の操作に使う.これを使うと日付,時間情報を保管したり取り出したりすることができる.また,特定の日付または時間に依存するクエリを実行することもできる.
このセクションの例を実際に試してみて,記載の通りに動作しなかった場合は,「データベースの例の使用」で述べているように"DatabaseLink`DatabaseExamples`"パッケージを使ってデータベースをもとの状態に戻す必要があるかもしれない.
DatabaseLink をロードし,demoデータベースに接続する.
Needs["DatabaseLink`"];
conn = OpenSQLConnection["demo"];例題用の表を作成する.この表にはDATE,TIME,DATETIME,TIMESTAMP列が含まれる.
SQLCreateTable[conn, "DATETIMETABLE", {SQLColumn["DATECOL", "DataTypeName" -> "DATE"], SQLColumn["TIMECOL", "DataTypeName" -> "TIME"], SQLColumn["DATETIMECOL", "DataTypeName" -> "DATETIME"], SQLColumn["TIMESTAMPCOL", "DataTypeName" -> "TIMESTAMP"]}]表にデータを挿入する.TIME以外のデータ型にはWolfram言語の関数DateList[]の出力が使える.TIMEには時間,分,秒を指定する3つの整数のリストを指定しなければならない.DATEはDateList[]の日付情報のみを使用し,時間情報は使わないことに注意されたい.DATETIMEとTIMESTAMPはどちらの情報も使い,またナノ秒を使う.
SQLInsert[conn, "DATETIMETABLE", {"DATECOL", "TIMECOL", "DATETIMECOL", "TIMESTAMPCOL"}, {SQLDateTime[DateList[]], SQLDateTime[{3, 4, 5}], SQLDateTime[DateList[]], SQLDateTime[DateList[]]}]データベースからデータを取り出すにはSQLSelectを使う.データはSQLDateTime式で返される.
SQLSelect[conn, "DATETIMETABLE"]SQLDropTable[conn, "DATETIMETABLE"];
CloseSQLConnection[conn];SQLExpr
Wolfram言語式をデータベースに保管するときはSQLExprを使う.保管したものを取り出すときはWolfram言語式に戻される.
このセクションの例を実際に試してみて,記載の通りに動作しなかった場合は,「データベースの例の使用」で述べているように"DatabaseLink`DatabaseExamples`"パッケージを使ってデータベースをもとの状態に戻す必要があるかもしれない.
DatabaseLink をロードしdemoデータベースに接続する.
Needs["DatabaseLink`"];
conn = OpenSQLConnection["demo"];Wolfram言語式を保管するには,VARCHAR等の文字列を保管するために使える列を作る必要がある.
SQLCreateTable[conn, "EXPRTABLE", {SQLColumn["EXPRCOL", "DataTypeName" -> "VARCHAR", "DataLength" -> 2 ^ 16]}]SQLInsert[conn, "EXPRTABLE", {"EXPRCOL"}, {SQLExpr[Sin[x ^ 2]]}]SQLSelectでデータをデータベースから取り出す.データはSQLExpr式として返される.
data = SQLSelect[conn, "EXPRTABLE"]SQLDropTable[conn, "EXPRTABLE"];
CloseSQLConnection[conn];