2014-02-03 3 views
1

В настоящее время я работаю над обучением, выполняя проект, который должен использовать базу данных для сохранения данных. Я использую Qt C++, и я установил postgres.app.Попытка подключения к Postgres с Qt

Моя первая попытка написать метод соединения в основном взяты из этого источника (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: Невозможно подключиться»

После того как я не смог е ix эта проблема, я решил начать метод с нуля. Это то, что я придумал после некоторых интернет-исследований и чтения 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; 

} 

Этот метод вызывается ошибка «FATAL: паролю потерпело неудачу для потребителя„janhettenkofer“»

я избавился от другого установка PostgreSQL с помощью метода, описанного здесь: https://stackoverflow.com/a/20010057. Теперь я получаю эту ошибку со второй функцией (это не изменить первое сообщение об ошибке): «FATAL: база данных„MYDB“не существует QPSQL: Невозможно подключиться»

В потоке упомянутого выше другого способа исправление первой ошибки было предложено, но когда я открываю терминал и набираю «какой psql», ничего не происходит, даже не отображается сообщение «команда не найдена». И я не имею ни малейшего представления о том, как применять рекомендации относительно экспорта PATH. Google только говорит мне, что я должен сделать это, но не как. Терминал - это еще одна вещь, которую я только изучаю.

Благодарим вас за любые идеи или советы по использованию терминала заблаговременно.

EDIT:

Хорошо, я узнал, как добавить Psql в PATH. Теперь я могу запустить which psql. Это указывает на установку Postgres.app, которую я использую. После этого я создал базу данных базы данных пользователей. Я могу подключиться к этой базе данных, используя либо Qt, либо терминал. Однако я не могу создать другую базу данных. Как я понимаю, вы делаете createdb mydb, а затем CREATE DATABASE. После этого \list по-прежнему показывает только пользовательскую базу данных, базу данных postgres и template0 и template1. Нет mydb.

+0

Если «какой psql» ничего не возвращает, psql не находится в вашей PATH. который не возвращает сообщение об ошибке, если ничего не найдено. Но да, сначала убедитесь, что вы можете подключиться к своей БД с правильными учетными данными, из командной строки или другого пользовательского интерфейса, прежде чем продолжить с Qt. –

+0

Как вы установили PostgreSQL в вашу систему OS X? –

+0

Спасибо @FrankOsterfeld, добавив psql в PATH, решили некоторые проблемы (см. Править). Я установил Postgres93.app. –

ответ

1

No such file or directory Is the server running locally and accepting connections on Unix domain socket "/var/pgsql_socket/.s.PGSQL.5432"? QPSQL: Unable to connect"

Либо PostreSQL не работает, или (скорее всего на Mac OS X) ваш Qt связан с libpq старой PostgreSQL поставляется в составе Mac OS X, и вы используете более новую версию вы установлены сами. Вы должны указать host как /tmp, чтобы заставить unix_socket_directory найти ваш Pg. Если это не так, проверьте правильное местоположение, подключив его с помощью psql и используя SHOW unix_socket_directory или (более новые версии) SHOW unix_socket_directories. Вы также должны указать SHOW port;, чтобы посмотреть, что прослушивает порт PostgreSQL; это относится к каталогам сокетов UNIX, а также к TCP/IP.

Единственное отличие второго кода является то, что вы указываете имя хоста, поэтому вы подключаетесь к localhost через TCP/IP, а не сокетов Unix.


Остальные ваши проблемы, вероятно, были вызваны не понимая эффект, который предварительно установленная версия Яблока PostgreSQL имеет в вашей системе. Я сильно подозреваю, что вы запускаете команды CREATE USER, , CREATE DATABASE и т. Д. В одной базе данных, в то время как ваша программа Qt подключается к другому экземпляру PostgreSQL.

(Мои чувства к Apple для создания этого беспорядка не могут быть распечатаны здесь).

Что вам нужно сделать, это:

  • Подтвердите unix_socket_directory и port номер экземпляра PostgreSQL установлен запущен; и затем

  • Используйте эти детали в своей программе Qt.

+0

Спасибо @CraigRinger, я сменил хост с 'localhost' на' tmp'. Вторая функция работает сейчас, но я все еще получаю старую ошибку для первой. –

+0

@JanHettdnkofer Да, потому что первый не может установить хост вообще, а ваш Qt связан с другим libpq, чем thr, работающим с PostgreSQL, поэтому каталог сокетов Unix по умолчанию, используемый, если не указан хост, отличается. Его дело Mac OS X, вызванное неправильной упаковкой Apple PostgreSQL в комплекте с ОС. –

Смежные вопросы