JDBC select 查询
JDBC select query
如何在不指定记录类型的情况下 SELECT * FROM table
然后遍历结果(未加载到内存中,我们的 table 非常庞大)?
我需要的是逐行迭代,同时将每一行转换为 JSON
。
我基本上想做这样的事情:
var selectRet = testdb->select("SELECT * FROM some_table", ());
.
.
.
foreach row in tb { io:println(<json> row);}
经过一个星期的研究`ballerina.io 文档,如果不先指定确切的 ROW 结构并使用类型行记录 { ..... },我仍然无法完成此操作,这在以下情况下非常不方便您的 table 有 200 列。
谢谢
您可以将 select 查询返回的 table 转换为 JSON 而无需将 table 转换为记录数组。看看下面的示例。我尝试使用最新版本的 Ballerina 0.980.1。我在这里使用了示例员工数据库。
// This function returns an optional type 'error?'
function performSelect() returns error? {
endpoint mysql:Client testDB {
host: "localhost",
port: 3306,
name: "employees",
username: "root",
password: "root12345678",
poolOptions: { maximumPoolSize: 5 },
dbOptions: { useSSL: false, allowPublicKeyRetrieval:true, serverTimezone:"UTC" }
};
// If the select query results in an error,
// then the 'check' operator returns it to the caller of this function
table resultTable = check testDB->select("SELECT * FROM employees", ());
// convert the table to a json object
json resultJson = check <json>resultTable;
io:println(resultJson);
testDB.stop();
// Return nil since there are no errors occurred
return ();
}
理想情况下,转换为 json 不应将整个 table 加载到内存中。但由于此 known issue 服务器在 table 到 json 转换期间出现 OOM。该修复程序将很快在即将发布的版本中提供。
您的用例是否迭代 table 并将每一行转换为 json?如果是这种情况,一旦上述问题得到解决,您应该能够按如下方式进行操作而不会填满内存。
import ballerina/io;
import ballerina/mysql;
endpoint mysql:Client testDB {
host: "localhost",
port: 3306,
name: "testdb",
username: "root",
password: "123",
poolOptions: { maximumPoolSize: 5 },
dbOptions: { useSSL: false }
};
function main(string... args) {
var selectRet = testDB->select("SELECT * FROM employee", ());
table dt;
match selectRet {
table tableReturned => dt = tableReturned;
error err => io:println("Select data from the table failed: "
+ err.message);
}
var ret = <json>dt;
json jsonData;
match ret {
json j => jsonData = j;
error e => io:println("Error occurred while converting the table to json" + e.message);
}
foreach j in jsonData {
match j {
string js => {
io:println("string value: ", js);
}
json jx => {
io:println("non-string value: ", jx);
}
}
}
}
如何在不指定记录类型的情况下 SELECT * FROM table
然后遍历结果(未加载到内存中,我们的 table 非常庞大)?
我需要的是逐行迭代,同时将每一行转换为 JSON
。
我基本上想做这样的事情:
var selectRet = testdb->select("SELECT * FROM some_table", ());
.
.
.
foreach row in tb { io:println(<json> row);}
经过一个星期的研究`ballerina.io 文档,如果不先指定确切的 ROW 结构并使用类型行记录 { ..... },我仍然无法完成此操作,这在以下情况下非常不方便您的 table 有 200 列。
谢谢
您可以将 select 查询返回的 table 转换为 JSON 而无需将 table 转换为记录数组。看看下面的示例。我尝试使用最新版本的 Ballerina 0.980.1。我在这里使用了示例员工数据库。
// This function returns an optional type 'error?'
function performSelect() returns error? {
endpoint mysql:Client testDB {
host: "localhost",
port: 3306,
name: "employees",
username: "root",
password: "root12345678",
poolOptions: { maximumPoolSize: 5 },
dbOptions: { useSSL: false, allowPublicKeyRetrieval:true, serverTimezone:"UTC" }
};
// If the select query results in an error,
// then the 'check' operator returns it to the caller of this function
table resultTable = check testDB->select("SELECT * FROM employees", ());
// convert the table to a json object
json resultJson = check <json>resultTable;
io:println(resultJson);
testDB.stop();
// Return nil since there are no errors occurred
return ();
}
理想情况下,转换为 json 不应将整个 table 加载到内存中。但由于此 known issue 服务器在 table 到 json 转换期间出现 OOM。该修复程序将很快在即将发布的版本中提供。
您的用例是否迭代 table 并将每一行转换为 json?如果是这种情况,一旦上述问题得到解决,您应该能够按如下方式进行操作而不会填满内存。
import ballerina/io;
import ballerina/mysql;
endpoint mysql:Client testDB {
host: "localhost",
port: 3306,
name: "testdb",
username: "root",
password: "123",
poolOptions: { maximumPoolSize: 5 },
dbOptions: { useSSL: false }
};
function main(string... args) {
var selectRet = testDB->select("SELECT * FROM employee", ());
table dt;
match selectRet {
table tableReturned => dt = tableReturned;
error err => io:println("Select data from the table failed: "
+ err.message);
}
var ret = <json>dt;
json jsonData;
match ret {
json j => jsonData = j;
error e => io:println("Error occurred while converting the table to json" + e.message);
}
foreach j in jsonData {
match j {
string js => {
io:println("string value: ", js);
}
json jx => {
io:println("non-string value: ", jx);
}
}
}
}