尝试用Qt连接到Postgres

时间:2014-02-03 18:32:18

标签: database macos qt postgresql qsqldatabase

目前我正在做一个应该使用数据库保存数据的项目学习。我正在使用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”时没有任何反应,甚至没有显示“未找到命令”消息。我不知道如何应用有关出口PATH的建议。 Google只告诉我,我应该这样做,而不是如何。终端是我只是学习使用的另一件事。

感谢您提前就如何使用终端提出任何想法或建议。

编辑:

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

1 个答案:

答案 0 :(得分:1)

  

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

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

与第二个代码段的唯一区别在于您指定了主机名,因此您通过TCP / IP连接到localhost,而不是unix套接字。


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

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

您需要做的是:

  • 确认您安装的PostgreSQL实例正在运行的unix_socket_directoryport号码;然后

  • 在您的Qt程序中使用这些详细信息。