目前我正在做一个应该使用数据库保存数据的项目学习。我正在使用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。
答案 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 USER
,ALTER USER
,CREATE DATABASE
等命令,而你的Qt程序正在连接到另一个PostgreSQL实例。
(我对Apple造成这种混乱的感觉在这里不可打印)。
您需要做的是:
确认您安装的PostgreSQL实例正在运行的unix_socket_directory
和port
号码;然后
在您的Qt程序中使用这些详细信息。