gpt4 book ai didi

mysql - Google App Scripts 不会在远程服务器上建立到 MySQL 的 Jdbc 连接

转载 作者:行者123 更新时间:2023-12-03 19:10:54 28 4
gpt4 key购买 nike

我是使用 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_USERDB_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")



我做了以下工作:
  • 将链接网页上的 IP 地址添加到我的服务器防火墙。重新加载防火墙以确保它使用此配置。
  • 查了一下数据库,DB_NAME ,存在于我的服务器上。
  • 检查主机名,HOST_NAME匹配我的服务器。还尝试使用外部 IP 地址。
  • 检查 MySQL 正在使用端口 3306
  • 检查用户名/密码( DB_USERDB_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/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com