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

标签 mysql google-apps-script jdbc

我是使用 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/

    相关文章:

    php - 检查 PHP 中的查询字符串值

    javascript - 如何通过 Google 文档表找到 'For Loop'

    mysql - 服务器时区值 'KST' 无法识别 : How to fix server-side?

    java - Play Framework : JDBC connection vs JDBC datasource

    MySQL 更新到 SQL Server 语法错误

    php - 使用 MATCH 和 AGAINST 从 MySQL 获取数据并限制结果以从相似名称的列中获取一个条目

    php - 如何使用关联数组向 MySql 中插入数据

    javascript - 谷歌脚本 - 创建要插入电子邮件中的值列表

    javascript - 如何获得显示的单元格的精确副本?

    spring - 无论我在哪里指定,Tomcat 7 都无法加载 ojdbc6.jar