"SQL-JDBC" (外部評価システム)
サポートされているデータベースのリスト »詳細
- ExternalEvaluateでデータベースがJDBCと使えるよう設定するためにはサポートされているデータベースのリストに記載されているそれぞれのデータベースの詳細を参照のこと.
ExternalEvaluateの使用法
- ExternalEvaluate["SQL-JDBC",code] はデータベース接続でSQLの列を実行し,Wolfram言語式として結果を返す.
- ExternalEvaluate["SQL-JDBC"form,code] はSQLの列を実行し,指定された form で結果を返す.form に指定できるのは"Dataset","Rows","NamedRows","Columns","NamedColumns"である.
- ExternalEvaluate[{"SQL-JDBC","Evaluator"Evaluator},…] の Evaluator として可能な設定:
-
"path"またはFile["path"] SQLiteデータベースへのパス URL["url"] "backend://user:password@host:port/name"の形式で指定された接続 DatabaseReference[…] SQLデータベース接続 SQLConnection[…] SQL-JDBCデータベース接続
データ型
- SQLのデータ型は適切なWolfram言語式にマップされる.
- 日付と時間は,通常DateObjectとTimeObjectに変換される.
- バイナリデータはByteArrayに変換される.
例題
すべて開く すべて閉じる例 (2)
db = DatabaseReference[FindFile["ExampleData/ecommerce-database.sqlite"]]ExternalEvaluate[{"SQL-JDBC", "Evaluator" -> db}, "SELECT * FROM offices"]外部言語のセルでSQLを使うためには,デフォルトのデータベースを登録する必要がある:
db = DatabaseReference[FindFile["ExampleData/ecommerce-database.sqlite"]]RegisterExternalEvaluator["SQL-JDBC", db]スコープ (5)
db = DatabaseReference[FindFile["ExampleData/ecommerce-database.sqlite"]]session = StartExternalSession[{"SQL-JDBC", "Evaluator" -> db}]ExternalEvaluate[session, "SELECT name FROM sqlite_master WHERE name NOT LIKE 'sqlite_%'"]ExternalEvaluate[session, "SELECT * FROM offices limit 4"]ExternalEvaluate[session, "SELECT officeCode AS id, addressLine1 || ' - ' || addressLine2 AS address FROM offices"]DeleteObject[session]ExternalEvaluateはDatabaseLink`SQLConnectionを取ることもできる:
Needs["DatabaseLink`"];db = SQLConnection[JDBC["SQLite", FindFile["ExampleData/ecommerce-database.sqlite"]]];ExternalEvaluate[db, "SELECT * FROM offices"]DatabaseLink`でサポートされるJDBCドライバはどれでも使うことができる:
ExternalEvaluate[SQLConnection[JDBC["PostgreSQL", "localhost/template1"]], "SELECT * FROM generate_series(3, 6)"]デフォルトではExternalEvaluateはDatasetを使ってデータを返す:
db = DatabaseReference[FindFile["ExampleData/ecommerce-database.sqlite"]]ExternalEvaluate[{"SQL-JDBC", "Evaluator" -> db}, "SELECT officeCode AS pk, phone FROM offices"]別の形式でデータを返すためには"ReturnType"を使うことができる:
ExternalEvaluate[{"SQL-JDBC", "Evaluator" -> db, "ReturnType" -> "Rows"}, "SELECT officeCode AS pk, phone FROM offices"]ExternalEvaluate[{"SQL-JDBC", "Evaluator" -> db, "ReturnType" -> "NamedRows"}, "SELECT officeCode AS pk, phone FROM offices"]ExternalEvaluate[{"SQL-JDBC", "Evaluator" -> db, "ReturnType" -> "Columns"}, "SELECT officeCode AS pk, phone FROM offices"]ExternalEvaluate[{"SQL-JDBC", "Evaluator" -> db, "ReturnType" -> "NamedColumns"}, "SELECT officeCode AS pk, phone FROM offices"]ローカルのPostgreSQLデータベースのセッションを開始する(この入力を評価するためには,適切なPostgreSQLデータベースインスタンスが実行している必要がある):
db = DatabaseReference[URL["postgres://localhost/template1"]]サポートされる場合は,ExternalEvaluateは文字列の代りにWolfram言語式を返す:
ExternalEvaluate[{"SQL-JDBC", "Evaluator" -> db}, "SELECT NOW() AS now, NOW()::date AS date, interval '1 day' AS interval, '1.23'::decimal AS decimal"]列のテンプレートを使うと,Wolfram言語式をSQLコードに挿入することができる:
db = DatabaseReference[FindFile["ExampleData/ecommerce-database.sqlite"]];x = 3;
y = 2;式 x^2+y^2はWolfram言語内で評価され,結果は変換されてSQLのコード列に挿入される:
ExternalEvaluate[{"SQL-JDBC", "Evaluator" -> db}, "SELECT <* x^2 + y^2 *> AS value"]Associationを使って,手動でテンプレートに引数を与える:
ExternalEvaluate[{"SQL-JDBC", "Evaluator" -> db}, <|
"Command" -> "SELECT city, addressLine1, country FROM offices WHERE country = `1`",
"TemplateArguments" -> {"USA"}
|>]ExternalEvaluate[{"SQL-JDBC", "Evaluator" -> db}, <|
"Command" -> "SELECT officeCode, city, addressLine1 FROM offices WHERE officeCode < `n`",
"TemplateArguments" -> <|"n" -> 4|>
|>]パラメータは,現在使用中のデータベースのバックエンドに従って自動的に正規化される.Integer,ByteArray,String,DateObject,TimeObject等の式は,バックエンドがサポートしている場合は使うことができる:
ExternalEvaluate[{"SQL-JDBC", "Evaluator" -> DatabaseReference["postgresql://localhost/template1"]}, <|
"Command" -> "SELECT `` AS number, NOW() AS now",
"TemplateArguments" -> {1}
|>]アプリケーション (2)
データベースに二次的作用を及ぼしている操作は,通常Nullを返す:
ExternalEvaluate[
{"SQL-JDBC", DatabaseReference[FindFile["ExampleData/ecommerce-database.sqlite"]]}, {
"CREATE TEMPORARY TABLE t(x INTEGER PRIMARY KEY ASC, y, z);",
"INSERT INTO t(x, y, z) VALUES (1, 2, 3)"
}]バックエンドによっては,データを挿入し戻り値を指定することができるものもある:
ExternalEvaluate[
{"SQL-JDBC", DatabaseReference["postgresql://localhost/template1"]}, {
"CREATE TEMPORARY TABLE test_data(
id SERIAL PRIMARY KEY,
name VARCHAR NOT NULL
)",
"INSERT INTO test_data(name) VALUES ('john') RETURNING(\"id\") as pk",
"SELECT id, name FROM test_data"
}]後でロールバックを実行するために接続を開いたままにしておくことができる.新しいデータベース接続を開始する:
session = StartExternalSession[{"SQL-JDBC", DatabaseReference[FindFile["ExampleData/ecommerce-database.sqlite"]]}]ExternalEvaluate[session, {
"CREATE TEMPORARY TABLE t(id SERIAL PRIMARY KEY, y INTEGER, z INTEGER)",
"INSERT INTO t(id, y, z) VALUES (1, 2, 3)",
"INSERT INTO t(id, y, z) VALUES (3, 4, 6)",
"INSERT INTO t(id, y, z) VALUES (4, 5, 6)"
}];ExternalEvaluate[session, "SELECT * from t"]トランザクションブロックを開始してデータをいくらか削除する:
ExternalEvaluate[session, "BEGIN"];ExternalEvaluate[session, "DELETE FROM t WHERE id=4"];ExternalEvaluate[session, "SELECT * from t"]ExternalEvaluate[session, "ROLLBACK"];ExternalEvaluate[session, "SELECT * from t"]DeleteObject[session]考えられる問題 (2)
db = DatabaseReference[URL["postgres://localhost/template1"]];ExternalEvaluate[{"SQL-JDBC", "Evaluator" -> db, "ReturnType" -> "Rows"}, "SELECT NOW()"]ExternalEvaluate[{"SQL-JDBC", "Evaluator" -> db, "ReturnType" -> "Rows"}, "SELECT NOW() at time zone 'UTC'"]または"SessionEpilog"を使ってデフォルトの時刻帯を設定することができる:
ExternalEvaluate[<|"Evaluator" -> db, "System" -> "SQL-JDBC", "SessionProlog" -> "SET TIME ZONE 'UTC'", "ReturnType" -> "Rows"|>, "SELECT NOW()"]ExternalEvaluateは,すでに開いている接続が提供されても常に内部的に新規の接続を維持する.
Needs["DatabaseLink`"];conn = OpenSQLConnection[JDBC["SQLite", FindFile["ExampleData/ecommerce-database.sqlite"]]]SQLConnections[]StartExternalSessionはJDBC接続を確立する:
session = StartExternalSession[conn]SQLConnections[]ExternalSessionObjectを削除すると,接続は自動的に閉じる:
DeleteObject[session];SQLConnections[]DatabaseLink`CloseSQLConnection[DatabaseLink`SQLConnections[]]テクニカルノート
関連するガイド
履歴
2020 で導入 (12.2)