【问题标题】:How to connect to specific database using JDBC and Google Apps Script如何使用 JDBC 和 Google Apps 脚本连接到特定数据库
【发布时间】:2021-06-14 20:46:07
【问题描述】:

我正在尝试使用 GAS 和 JDBC 连接到 Google Cloud MySQL 5.7 实例。我可以正常运行以下命令:

var conn = Jdbc.getCloudSqlConnection("jdbc:google:mysql://my-instance-111111:us-central1:mydbname", user,userPwd)

但这并没有连接到特定的数据库,即当我运行时

var stmt = conn.createStatement();
var results = stmt.executeQuery('SELECT col FROM myTable;');

我收到Error Exception: No database selected

尝试修复的一种方法:

GAS docs 表示我可以使用高级参数来包含数据库名称,但是当我运行var conn = Jdbc.getCloudSqlConnection("jdbc:google:mysql://my-instance-111111:us-central1:mydbname", user,userPwd,mydbname) 时,

我收到Exception: The parameters (String,String,String,String) don't match the method signature for Jdbc.getCloudSqlConnection

我根据许多 StackOverflow 帖子尝试过的 getCloudSqlConnection 语句集合:

var conn = Jdbc.getCloudSqlConnection("jdbc:google:mysql://my-instance-111111:us-central1:mydbname/mydbname", user,userPwd)

var conn = Jdbc.getCloudSqlConnection("jdbc:google:mysql://my-instance-111111:us-central1:mydbname:3306/mydbname", user,userPwd)

var conn = Jdbc.getCloudSqlConnection("jdbc:google:mysql://my-instance-111111:us-central1:mydbname:3307/mydbname", user,userPwd)

对于上述陈述,我还尝试将my-instance-111111:us-central1:mydbname 替换为 GC 概述网页上提供的公共 IP。全部返回Exception: Failed to establish a database connection. Check connection string, username and password.

我正在使用用户 root 和适当的密码。我可以通过命令行使用我在 GAS 中提供的用户和密码进入数据库,所以我不认为我提供了错误的用户和密码。

编辑: 我回到了@AddonDepot 提到的文档,并意识到我需要传递一个对象,但我仍然无法完成这项工作......

var obj = {
             connectTimeoutSeconds: 15,
             database: "mydbname",
             instance: "my-instance-111111:us-central1:mydbname",
             password: userPwd,
             queryTimeoutSeconds: 15,
             user: user   };



var conn = Jdbc.getCloudSqlConnection("jdbc:google:mysql://my-instance-111111:us-central1:mydbname", obj);

返回

Exception: The following connection properties are unsupported: database,instance,connectTimeoutSeconds,queryTimeoutSeconds. .

我在创建对象时做错了吗?我猜不是,因为 GAS 可以识别 userpassword。为什么不能识别其他高级参数?

【问题讨论】:

  • getCloudSqlConnection() 函数有 3 个变体,具有不同的方法签名(即,通过传递给函数的参数的数量和类型来区分)。再次阅读文档以阐明用法。
  • 您可以使用其他方法进行远程连接吗?
  • @Martí 是的,我可以从本地计算机上的终端完全访问数据库。为此,我使用了与 GAS 脚本中完全相同的用户名和密码。

标签: mysql google-apps-script jdbc google-cloud-platform


【解决方案1】:

我们必须区分数据库系统实例(有时简称为数据库;我将使用实例)和其中的数据库。这意味着您可能有一个实例,但可能没有在其中创建任何数据库。

您可以使用 Apps 脚本在您的实例中创建一个新数据库:

const connectionName = 'connection-name:for-your:instance'
const dbName = 'database'
const username = 'user'
const password = 'password'

function createDB() {
  const conn = Jdbc.getCloudSqlConnection(`jdbc:google:mysql://${connectionName}`, username, password)
  conn.createStatement().execute('CREATE DATABASE ' + dbName)
}

在实例中创建数据库后,您就可以使用它了:

function useDB() {
  const conn = Jdbc.getCloudSqlConnection(`jdbc:google:mysql://${connectionName}/${dbName}`, username, password)

  // Use conn
}

参考文献

【讨论】:

    猜你喜欢
    • 2021-08-02
    • 1970-01-01
    • 2018-11-02
    • 2022-11-23
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    相关资源
    最近更新 更多