繁体   English   中英

使用Qt转储MySQL数据库

[英]Dump MySQL database with Qt

我有这个插槽:

void Managment::dbExportTriggered()
 {
    save = QFileDialog::getSaveFileName(this, trUtf8("Export db"),
                              QDir::currentPath() + "Backup/",
                              trUtf8("Dumped database (*.sql)"));

    sqlQuery = "SELECT * INTO OUTFILE '" + save + ".sql' FROM Users, Data";
    //QMessageBox::critical(0, trUtf8("query dump"), QString::number(query.exec(sqlQuery)));
    query.exec(sqlQuery);
 }

我有这个问题:

sqlQuery = "SELECT * INTO OUTFILE " + save + " FROM Users, Data";

我正常执行但没有出现转储文件, backup目录具有正确的权限,转储的数据库必须在客户端。

更新:搜索后我发现INTO OUTFILE查询会将数据库转储到服务器而不是客户端,因为我想到了,所以我现在的问题是如何在远程MySQL服务器中转储数据库,任何快速方法都没有任何外部工具如mysqldump客户端。

只是一个想法:另一种方法是使用QProcess调用mysqldump 有些google-fu 似乎就是一个例子:

..
if (allDatabases->isChecked()) {
    arguments << "--all-databases";
  } else {
    arguments << "--databases";
    foreach(QListWidgetItem *item, databasesList->selectedItems())
      arguments << item->text();
  }
  proc->setReadChannel(QProcess::StandardOutput);
  QApplication::setOverrideCursor(Qt::WaitCursor);
  proc->start("mysqldump", arguments);
..

因此,您还可以添加一些参数来仅转储特定的表

编辑:

请注意SELECT ... INTO OUTFILE语句中的mysql文档

如果要在服务器主机之外的其他主机上创建生成的文件,通常无法使用 SELECT ... INTO OUTFILE,因为无法相对于服务器主机的文件系统写入文件的路径。

因此,您必须自己滚动,或者您可以使用上面文档中建议的mysql -e

SELECT ... INTO OUTFILE在MySQL服务器计算机上创建一个文件,其权限与MySQL服务器运行的任何一个匹配。 除非您在MySQL服务器上具有root访问权限以检索您要导出的文件,否则SELECT ... INTO OUTFILE不太可能执行您想要的操作。

事实上,我想我甚至会说,如果你试图从GUI客户端使用SELECT ... INTO OUTFILE ,你可能会采取错误的方法解决你的问题。

  1. 您是否转储/打印保存以检查它是否有效? currentPath()是否返回了一个“/”?
  2. 您的客户端程序看到的路径与服务器看到的路径之间是否存在差异?
  3. 用户是否具有必要的权限(肯定是文件权限,可能更多)
  4. 你不能从日志中收到错误信息吗?

您是否在运行sql语句时遇到任何错误?

我注意到你将文件名连接到SQL查询而不用引号括起来。 你的代码会产生类似的东西

SELECT * INTO OUTFILE /path/to/somewhere FROM Users, Data

MySQL文档说它需要类似的东西

SELECT * INTO OUTFILE '/path/to/somewhere' FROM Users, Data

还要记住以下几点:

该文件是在服务器主机上创建的,因此您必须具有FILE权限才能使用此语法。 file_name不能是现有文件,除其他外,它会阻止/etc/passwd和数据库表/etc/passwd文件被销毁。

如果您在客户端上查看,即使操作成功,您也不会在那里看到该文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM