我有这个插槽:
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
客户。
答案 0 :(得分:1)
只是一个想法:另一种方法是使用mysqldump调用QProcess。有些google-fu this似乎就是一个例子:
..
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 doc:
如果要创建结果 文件在某些其他主机上比 服务器主机,通常无法使用 SELECT ... INTO OUTFILE因为有 无法写入文件的路径 相对于服务器主机的文件 系统
因此,您必须自己动手,或者您可以按照上述文档的建议使用mysql -e
。
答案 1 :(得分:1)
SELECT ... INTO OUTFILE
在MySQL服务器计算机上创建一个文件,其权限与MySQL服务器运行的任何一个匹配。除非您在MySQL服务器上具有root访问权限以检索您要导出的文件,否则SELECT ... INTO OUTFILE
不太可能执行您想要的操作。
事实上,我想我甚至会说,如果你试图从GUI客户端使用SELECT ... INTO OUTFILE
,你可能会采取错误的方法处理你的问题。
答案 2 :(得分:0)
答案 3 :(得分:0)
您是否在运行sql语句时遇到任何错误?
我注意到你将文件名连接到SQL查询中而不用引号括起来。您的代码将产生类似
的内容SELECT * INTO OUTFILE /path/to/somewhere FROM Users, Data
但是MySQL documentation说它想要像
这样的东西SELECT * INTO OUTFILE '/path/to/somewhere' FROM Users, Data
还要记住以下几点:
该文件是在服务器主机上创建的,因此您必须具有FILE权限才能使用此语法。
file_name
不能是现有文件,除其他外,它会阻止/etc/passwd
和数据库表等文件被销毁。
如果您在客户端上查看,即使操作成功,也不会在那里看到该文件。