"SQL-JDBC"
"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"or 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"]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"]开启事务区块 (transaction block) 并删除某些数据:
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'"]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)