我是使用 Google Scripts 的新手,正在尝试连接到 MySQL (5.5.65-MariaDB) 数据库,该数据库托管在运行 CentOS Linux 7.7.1908 Core 的外部(非 Google)服务器上。
我正在遵循此处的指南:https://developers.google.com/apps-script/guides/jdbc#other_databases
在我的脚本中,我使用了以下函数:
// export_sheet_data.gs
function writeOneRecord() {
var conn = Jdbc.getConnection('jdbc:mysql://HOST_NAME.com:3306/DB_NAME', 'DB_USER', 'DB_PASSWORD');
var stmt = conn.prepareStatement('INSERT INTO entries '
+ '(guestName, content) values (?, ?)');
stmt.setString('andy', 'First Guest');
stmt.execute();
}
显然是
HOST_NAME
, DB_NAME
, DB_USER
和 DB_PASSWORD
是对应于适当值的字符串(字面输入,而不是变量):我的外部服务器的主机名、数据库名称、数据库用户名和数据库密码。当我在脚本控制台(运行 > 运行功能 >
writeOneRecord()
)中执行此操作时,它说Running function writeOneRecord()
约 10 秒。
然后它会出错
Exception: Failed to establish a database connection. Check connection string, username and password.
如果我点击“详细信息”,它并没有真正详细说明这一点。它说
Exception: Failed to establish a database connection. Check connection string, username and password. (line 54, file "export_sheet_data")
我做了以下工作:
DB_NAME
,存在于我的服务器上。 HOST_NAME
匹配我的服务器。还尝试使用外部 IP 地址。 DB_USER
和 DB_PASSWORD
)是否正确。 我正在连接的服务器上的防火墙日志中没有出现任何关于此的内容。
我已经检查过我正在使用
Jdbc.getConnection
正确。我还能怎么调试这个? Google Scripts 控制台中似乎没有任何可以提供帮助的内容。
最佳答案
您使用的是 VPS Linux 吗?
我遇到了同样的问题,无法解决。这似乎是 GAS JDBC 实现的一个错误,它结合了 VPS 和/或特定 MYSQL 实现中使用的自定义网络驱动程序。
对于某些 Linux/Mysql 组合,我能够连接到 Linux Mysql,而有些则不能。
在我的案例中的错误是“读取通信数据包时出错”(mysql 日志) - 很难跟踪 mysql 错误。
如果您检查服务器上的 mysql 日志并且这是这个错误,我认为您能做的最好的事情就是遵循@TheAddonDepot 建议的简化版本 - 编写一个小的 nodejs 代码来为您运行 sql 并将其安装为 linux 服务(在自定义端口上监听 http )- 有很多例子。为此花费几个小时会更容易,因为我认为这个问题不会在不久的将来得到解决。
我还没有测试过,但像这样的东西应该适合你的情况。
var http = require('http');
var url = require('url');
var mysql = require('mysql');
var con = mysql.createConnection({
host: "localhost",
user: "yourusername",
password: "yourpassword",
database: "mydb"
});
con.connect(function(err) {
if (err) throw err;
console.log("Connected to mysql!");
});
http.createServer(function (req, res) {
var q = url.parse(req.url, true).query;
var result;
let stmt = `INSERT INTO entries (guestName, content) values (?, ?)`;
let values = [q.guestName, q.content];
console.log('Request', q);
// execute the insert statment
connection.query(stmt, values, (err, results, fields) => {
if (err) {
res.writeHead(400, {'Content-Type': 'application/json'});
console.error(err.message);
result = {error:err};
} else {
res.writeHead(200, {'Content-Type': 'application/json'});
console.log('Insert Id:' + results.insertId);
result = {success:true, id:results.insertId};
}
});
res.end(JSON.stringify(result));
}).listen(7733);
并从 GAS 中调用它,例如
UrlFetchApp.fetch('http://your-server-ip:7733/?guestName=' + encodeURIComponent(guestName) + '&content=' + encodeURIComponent(content));
或者,您可以尝试切换 Linux/Mysql 版本,但它更复杂,而且我不确定切换组合是否完全正确,因为在我的情况下错误是在 Debian 18.04 上
关于mysql - Google App Scripts 不会在远程服务器上建立到 MySQL 的 Jdbc 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62191987/