0

问题:

我的 C++ 应用程序连接到 MySQL 服务器,读取每个 db export.txt 的第一行/标题行,创建一个创建表语句以准备导入并针对数据库执行该语句(没问题,该表按预期显示) -- 但是当我尝试执行 LOAD DATA LOCAL INFILE 将数据导入新创建的表时,我收到错误“此 MySQL 版本不允许使用的命令”。但是,这适用于 CLI!当我在 CLI 上执行此命令时,mysql -u <user> -p<password> -e "LOAD DATA LOCAL INFILE 'myfile.txt' INTO TABLE mytable FIELDS TERMINATED BY '|' LINES TERMINATED BY '\r\n';"它可以完美运行吗?

情况:

我的公司每月从我们的供应商那里获得大量的数据库导出(160 个文件/10gb 的 .txt 文件,以“|”分隔),这些文件必须替换旧的供应商列表。我正在开发一个小型 C++ 应用程序来在我的工作桌面上处理它。该应用程序旨在设置所需的表,导入数据,然后对多个表执行一系列中间查询,以将信息组装到一系列最终表中,然后将其本身导出并上传到生产环境,以用于公司电子商务网站。

我的设置:

Ubuntu 12.04

MySQL Server v. 5.5.29 + MySQL 命令行客户端

Linux GNU C++ 编译器

libmysqlcppconn 已安装,并且我已链接所需的 mysqlconn 库。

我已经克服/尝试了以下问题/组合:

1.) 我已经发现(艰难的方式)必须在配置中启用 LOAD DATA [LOCAL] INFILE 语句——我在客户端和服务器的配置文件中都设置了“local-infile”选项。(通过使用客户端和服务器的“local-infile”语句更新 /etc/mysql/my.cnf 来修复。注意:我可以使用 --local-infile=1 重新启动 mysql-server,但这是我的本地开发环境,所以我只想让它永久打开)

2.) 如果目标导入文件未启用执行权限(使用 chmod +x target_file.txt 修复),则 LOAD DATA LOCAL INFILE 似乎无法执行导入(从 CLI)

3.)我在我的应用程序代码中使用 mysql root 帐户(因为它是我的本地主机,而不是生产环境,并且这个特定的程序永远不会在生产服务器上运行。)

4.)我尝试使用 sudo 命令执行我编译的二进制程序(没有变化,同样的错误“这个 MySQL 版本不允许使用的命令”)

5.)我尝试将二进制文件的所有权从我的正常登录更改为 root(没有更改,同样的错误“此 MySQL 版本不允许使用使用的命令”)

6.) 我知道 libcppmysqlconn 正在工作,因为我能够毫无问题地连接并执行 CREATE TABLE 调用,并且我可以执行其他查询并执行语句

我错过了什么?有什么建议么?提前致谢 :)

4

1 回答 1

1

在使用 /etc/mysql/my.cfg 文件进行大量尝试和错误之后(我知道这是一个权限问题,因为它可以在命令行上工作,但不能从连接器上工作)并且经过大量谷歌搜索并找到一些后巷技术支持帖子 我得出的结论是 MySQL C++ 连接器没有(无论出于何种原因)决定实现开发人员能够允许来自 C++ 连接器的 local-infile=1 选项的能力。

显然,有些人已经能够破解/分叉 MySQL C++ 连接器以公开该功能,但没有人发布他们的源代码——只说它有效。显然,在初始化连接后,MySQL C API 中有一个解决方法,您将使用它:

mysql_options( &mysql, MYSQL_OPT_LOCAL_INFILE, 1 );

这显然允许 LOAD DATA LOCAL INFILE 语句与 MySQL C API 一起使用。

以下是一些使我得出这个结论的参考文章:

1.)如何从 MySQL Connector/C++ 获取本机 C API 连接结构?

2.) Mysql 5.5 LOAD DATA INFILE 权限

3.) http://osdir.com/ml/db.mysql.c++/2004-04/msg00097.html

本质上,如果您希望能够从编程连接器 API 中使用 LOAD DATA LOCAL INFILE 功能——您必须使用 mysql C API 或 hack/fork 现有的 mysql C++ api 来公开连接结构。或者只是坚持从命令行执行 LOAD DATA LOCAL INFILE :(

于 2013-04-09T05:21:23.217 回答