所以...我一直在尝试通过 Apps 脚本函数设置与 Cloud SQL for MySQL 数据库的连接,但是我无法弄清楚它为什么不起作用。我一直关注documentation for JDBC ,但是无论我做什么,连接总是失败。
以下是我正在使用的代码:
const connectionName = '<project_id>:<region>:<instance_id>';
const user = '<user>';
const userPwd = '<user_pass>';
const db = '<database>';
const dbUrl = 'jdbc:google:mysql://' + connectionName + '/' + db;
function connect() {
const conn = Jdbc.getCloudSqlConnection(dbUrl, user, userPwd);
let start = new Date();
let stmt = conn.createStatement();
stmt.setMaxRows(1000);
let results = stmt.executeQuery('SELECT * FROM entries');
let numCols = results.getMetaData().getColumnCount();
while (results.next()) {
let rowString = '';
for (let col = 0; col < numCols; col++) {
rowString += results.getString(col + 1) + '\t';
}
Logger.log(rowString);
}
results.close();
stmt.close();
let end = new Date();
Logger.log('Time elapsed: %sms', end - start);
}
运行此代码时出现以下错误:
每次运行代码时,我都可以在 mysqlerr 日志中看到新行:
我已使用公共(public) IP 设置了 Cloud SQL 实例,但尚未将任何网络列入白名单。该文档没有提到它是必需的步骤。另外,我已经为此 Apps 脚本项目的 GCP 项目设置了项目编号,但仍然收到此错误。
编辑
根据要求,我添加了有关该实例的更多屏幕截图:
我可以使用 gcloud sqlinstances connect
命令连接到 Cloud SQL 实例,一旦进入,我就可以查询我想要的表。 (请记住,该表目前为空,因为我们目前处于开发的早期阶段)
我相信这排除了我使用错误用户/密码的可能性。
如您所见,我使用的是 max_allowed_packet
标志的默认值。老实说,我还没有在此实例上设置任何标志。
关于连接名称,我使用的是上面代码片段中共享的格式,实际上我是从 Cloud Console 复制并粘贴的。
下一个屏幕截图是实例设置的摘要:
提前致谢! 😁
最佳答案
我在维护 Google Cloud SQL 连接器库的团队工作。
我能够让您的代码示例与我自己的项目一起使用,所以我不认为您的代码有问题。我要尝试的第一件事是仔细检查 user、userPwd 和 connectionName 的值。如果这些都正确,那么我还将确保您尝试登录的用户有权访问数据库。
对于您在日志中看到的那些错误,此troubleshooting documentation有一些关于您可以尝试的事情的建议。一次建议是增加 max_allowed_packet
标志
如果您确定所有这些值都正确,请跟进此评论,我们可以尝试进一步调试。
关于mysql - 无法使用 JDBC 将 Apps 脚本连接到 Cloud SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67269934/