1

目前,我正在开展一个边做边学的项目,该项目应该使用数据库来保存数据。我正在使用 Qt C++ 并且我已经安装了 postgres.app。

我第一次尝试编写连接方法主要取自这个来源(http://www.youtube.com/watch?v=3XE2bKUAxfw),经过一些修改后看起来像这样:

int database::connect(QString servername, QString dbname){

QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");

db.setConnectOptions();

QString dsn = QString("Driver={PostgreSQL};Server=%1;Port=5432;Database=%2;").arg(servername).arg(dbname);

db.setDatabaseName(dsn);

if (db.open()){
    qDebug() << "Opened";

    return 1;

    db.close();
} else {
    qDebug() << "Error = " << db.lastError().text();
    return -1;
}

}

第一种方法产生错误:“无法连接到服务器:没有这样的文件或目录服务器是否在本地运行并接受 Unix 域套接字上的连接“/var/pgsql_socket/.s.PGSQL.5432”?QPSQL:无法连接"

在我无法解决这个问题之后,我决定从头开始这个方法。这是我在一些互联网研究和阅读 Qt 文档后得出的结论:

int database::nconnect(QString servername, QString dbname){

QSqlDatabase db;
db = (QSqlDatabase::addDatabase("QPSQL"));
db.setHostName(servername);
db.setDatabaseName(dbname);
db.setUserName("janhettenkofer");
db.setPassword("testpw");
bool connectioncheck = db.open("janhettenkofer","testpw");

if (connectioncheck == true){
    qDebug() << "Connection to database established." << endl;
} else {
    qDebug() << "Error for database " << db.databaseName() << " :" << db.lastError().text() << endl;
}
return connectioncheck;

}

此方法导致错误“致命:用户“janhettenkofer”的密码验证失败”

我用这里解释的方法摆脱了另一个 PostgreSQL 安装:https ://stackoverflow.com/a/20010057 。现在我用第二个函数得到这个错误(它没有改变第一个错误消息):“致命:数据库“mydb”不存在 QPSQL:无法连接”

在上面提到的线程中,提出了另一种修复第一个错误的方法,但是当我打开终端并输入“which psql”时什么也没发生,甚至没有显示“command not found”消息。而且我不知道如何应用有关导出路径的建议。谷歌只告诉我应该这样做,但不告诉我怎么做。终端是我刚刚学习使用的另一件事。

感谢您提前提供有关如何使用终端的任何想法或建议。

编辑:

好的,我发现了如何将 psql 添加到 PATH 中。现在我可以跑了which psql。这指向我正在使用的 Postgres.app 安装。之后,我创建了用户数据库数据库。我可以使用 Qt 或终端连接到该数据库。但是我无法创建任何其他数据库。据我了解,你这样做createdb mydb,然后CREATE DATABASE。在我这样做之后\list仍然只显示用户数据库、postgres 数据库和 template0 和 template1。没有mydb。

4

1 回答 1

1

没有这样的文件或目录 服务器是否在本地运行并接受 Unix 域套接字“/var/pgsql_socket/.s.PGSQL.5432”上的连接?QPSQL:无法连接”

PostreSQL 没有运行,或者(很可能在 Mac OS X 上)您的 Qt 链接到libpq作为 Mac OS X 的一部分提供的旧 PostgreSQL,并且您正在运行您自己安装的较新版本。您应该指定host强制/tmpunix_socket_directory您的 Pg 运行的位置。如果不是这样,请通过连接psql并使用SHOW unix_socket_directoryor (较新版本)检查正确的位置SHOW unix_socket_directories。您还应该SHOW port;查看 PostgreSQL 正在侦听的端口;这适用于 unix 套接字目录以及 TCP/IP。

第二个片段的唯一区别是您指定了 hostname,因此您localhost通过 TCP/IP 连接,而不是 unix 套接字。


您的其余问题可能是由于不了解 Apple 预装的 PostgreSQL 版本对您的系统的影响造成的。我强烈怀疑您正在一个数据库上运行CREATE USER, ALTER USER, CREATE DATABASEetc 命令,而您的 Qt 程序正在连接到另一个 PostgreSQL 实例。

(我对 Apple 造成这种混乱的感觉在这里无法打印)。

你需要做的是:

  • 确认您安装的 PostgreSQL 实例正在运行的编号unix_socket_directory和编号;port接着

  • 在你的 Qt 程序中使用这些细节。

于 2014-02-04T00:50:58.663 回答