我刚开始使用Google Apps Script,很长时间后又进行了类似的开发。返回以下代码:
异常:未选择数据库when I execute
测试202302110454()
它无法执行createTable()
函数。该代码是来自Google的示例代码的大杂烩,用于将其JDBC连接器/库与Google Apps Script Web应用程序和我自己的修改一起使用。
后端是一个Google Cloud SQL MySQL数据库示例。
const debug = true;
debug ? Logger.log("I'm inside service/jdbc.gs.") : null ;
const jdbcEnv = ifSql(database);
// Check to see if we're using an SQL back-end rather than Firestore et al.
function ifSql(database) {
if (database == "sql") {
return initSql()
}
return [];
}
// If we're using SQL, set up the JDBC environment
function initSql() {
const url = "jdbc:google:mysql://goals-and-projects:us-central1:mysql-instance";
const db = "goalManagementApp";
const environmentObject = {
"instanceUrl": url,
"db": db,
"dbUrl": `${url}/${db}`,
"root": "root", // TODO: Move this to the Properties service
"rootPwd": "*****************", // TODO: Move this to the Properties service
};
return environmentObject;
}
function getSQLConnection(env) {
const connection = Jdbc.getCloudSqlConnection(env.instanceUrl, env.root, env.rootPwd);
return connection;
}
function test202302110454() {
Logger.log("I'm running a test function.");
Logger.log(jdbcEnv);
Logger.log(createDatabase(`database` + Date.now(), jdbcEnv));
Logger.log(createTable(`table` + Date.now(), jdbcEnv));
}
/**
* Create a new database within a Cloud SQL instance.
*/
function createDatabase(databaseName, env) {
debug ? Logger.log("Inside createDatabase()") : null;
const db = databaseName;
const connection = getSQLConnection(env);
try {
connection.createStatement().execute('CREATE DATABASE ' + db);
} catch (err) {
// TODO(developer) - Handle exception from the API
console.log('Failed with an error %s', err.message);
}
}
/**
* Create a new table in the database.
*/
function createTable(tableName, env) {
debug ? Logger.log("Inside createTable()") : null;
try {
const connection = getSQLConnection(env);
//const connection = Jdbc.getCloudSqlConnection(env.dbUrl, env.root, env.rootPwd);
debug ? Logger.log(env) : null;
connection.createStatement().execute(`CREATE TABLE ${tableName} ` +
'(guestName VARCHAR(255), content VARCHAR(255), ' +
'entryID INT NOT NULL AUTO_INCREMENT, PRIMARY KEY(entryID));');
} catch (err) {
// TODO(developer) - Handle exception from the API
console.log('Failed with an error %s, %s', err.message, err);
}
}
但是,此修改使createTable()
函数按预期工作,没有错误:
//const connection = getSQLConnection(env);
const connection = Jdbc.getCloudSqlConnection(env.dbUrl, env.root, env.rootPwd);
当我尝试使用我自己的函数getSQLConnection
来创建一个连接对象时,它失败了,但是当我使用Jdbc.getCloudSqlConnection
时它成功了。除非我遗漏了什么,否则当运行createDatabase()
时情况并非如此,即使我认为我是以相同的方式设置它们的。我输出在每种情况下使用的连接对象,它们看起来都是相同的;我没有发现丢失的数据库名称。
我错过了什么?
更多背景信息:
我在网站的Google Apps Script脚本环境中执行此操作。我在UI中选择测试函数(test202302110454
)并运行它。我创建test202302110454
函数是为了测试我的其他函数并确保我知道它们在做什么。
确切的日志控制台输出为:
11:20:10 PM Info I'm inside service/jdbc.gs.
11:20:10 PM Info I'm running a test function.
11:20:10 PM Info {dbUrl=jdbc:google:mysql://goals-and-projects:us-central1:mysql-instance/goalManagementApp, root=root, rootPwd=**********, db=goalManagementApp, instanceUrl=jdbc:google:mysql://goals-and-projects:us-central1:mysql-instance}
11:20:10 PM Info Inside createDatabase()
11:20:10 PM Info null
11:20:10 PM Info Inside createTable()
11:20:10 PM Info {rootPwd=***********, dbUrl=jdbc:google:mysql://goals-and-projects:us-central1:mysql-instance/goalManagementApp, db=goalManagementApp, instanceUrl=jdbc:google:mysql://goals-and-projects:us-central1:mysql-instance, root=root}
11:20:10 PM Info Failed with an error No database selected, Exception: No database selected
11:20:10 PM Info null
可能有用的参考资料:
- https://developers.google.com/apps-script/reference/jdbc/jdbc#getcloudsqlconnectionurl,-用户名,-密码
1条答案
按热度按时间gcuhipw91#
这两个调用的第一个参数不同:
env.dbUrl
属性添加了/${db}
,因此这可能是缺少的内容。