javascript 为什么Jdbc.getCloudSqlConnection()返回“异常:在一个上下文中未选择“数据库”,但在另一个上下文中未选择?

y0u0uwnf  于 2023-02-15  发布在  Java
关注(0)|答案(1)|浏览(122)

我刚开始使用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,-用户名,-密码
gcuhipw9

gcuhipw91#

这两个调用的第一个参数不同:

const connection = Jdbc.getCloudSqlConnection(env.dbUrl, env.root, env.rootPwd);
const connection = Jdbc.getCloudSqlConnection(env.instanceUrl, env.root, env.rootPwd);

env.dbUrl属性添加了/${db},因此这可能是缺少的内容。

相关问题