Как подключить PostgreSQL с нуля
Я знаю что PostgreSQL довольно хорошая, быстрая и надежная. Но вот как бы мне подключиться на С++ к базе данных с нуля? Что нужно устанавливать?
Как настроить?
Какая библиотека С++ для подключения? Допустим SQLite(я использовал только в python django) это просто один файл . Но я сомневаюсь, что postresql тоже просто 1 файл. Ну вообщем, как мне настроить базу данных на postgreSQL локально(можно так же сказать как это потом на просторы интернета залить, но не обязательно). И как подключится через С++ к ней. Ну и выполнять запросы.
Отслеживать
27k 3 3 золотых знака 27 27 серебряных знаков 40 40 бронзовых знаков
задан 3 июл 2020 в 8:55
1,128 2 2 золотых знака 7 7 серебряных знаков 31 31 бронзовый знак
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Для разработки, пожалуй, может оказаться удобным не ставить его как сервис, а просто качнуть архив с бинарниками. В архиве есть батники для запуска и остановки сервера.
Как настроить — да никак, для использования в одну каску он готов к употреблению. Кроме постгреса вам может понадобится pgadmin4 (Или любой другой его аналог). Это инструмент администрирования, он работает через веб-браузер. Настройка там тривиальна:
Хост localhost Пользователь postgres Пароль пустой База postgres
Клиентская библиотека называется libpq
* testlibpq.c * * Test the C version of libpq, the PostgreSQL frontend library. */ #include #include #include static void exit_nicely(PGconn *conn) < PQfinish(conn); exit(1); >int main(int argc, char **argv) < const char *conninfo; PGconn *conn; PGresult *res; int nFields; int i, j; /* * If the user supplies a parameter on the command line, use it as the * conninfo string; otherwise default to setting dbname=postgres and using * environment variables or defaults for all other connection parameters. */ if (argc >1) conninfo = argv[1]; else conninfo = "dbname = postgres"; /* Make a connection to the database */ conn = PQconnectdb(conninfo); /* Check to see that the backend connection was successfully made */ if (PQstatus(conn) != CONNECTION_OK) < fprintf(stderr, "Connection to database failed: %s", PQerrorMessage(conn)); exit_nicely(conn); >/* * Our test case here involves using a cursor, for which we must be inside * a transaction block. We could do the whole thing with a single * PQexec() of "select * from pg_database", but that's too trivial to make * a good example. */ /* Start a transaction block */ res = PQexec(conn, "BEGIN"); if (PQresultStatus(res) != PGRES_COMMAND_OK) < fprintf(stderr, "BEGIN command failed: %s", PQerrorMessage(conn)); PQclear(res); exit_nicely(conn); >/* * Should PQclear PGresult whenever it is no longer needed to avoid memory * leaks */ PQclear(res); /* * Fetch rows from pg_database, the system catalog of databases */ res = PQexec(conn, "DECLARE myportal CURSOR FOR select * from pg_database"); if (PQresultStatus(res) != PGRES_COMMAND_OK) < fprintf(stderr, "DECLARE CURSOR failed: %s", PQerrorMessage(conn)); PQclear(res); exit_nicely(conn); >PQclear(res); res = PQexec(conn, "FETCH ALL in myportal"); if (PQresultStatus(res) != PGRES_TUPLES_OK) < fprintf(stderr, "FETCH ALL failed: %s", PQerrorMessage(conn)); PQclear(res); exit_nicely(conn); >/* first, print out the attribute names */ nFields = PQnfields(res); for (i = 0; i < nFields; i++) printf("%-15s", PQfname(res, i)); printf("\n\n"); /* next, print out the rows */ for (i = 0; i < PQntuples(res); i++) < for (j = 0; j < nFields; j++) printf("%-15s", PQgetvalue(res, i, j)); printf("\n"); >PQclear(res); /* close the portal . we don't bother to check for errors . */ res = PQexec(conn, "CLOSE myportal"); PQclear(res); /* end the transaction */ res = PQexec(conn, "END"); PQclear(res); /* close the connection to the database and cleanup */ PQfinish(conn); return 0; >
Как подключить postgresql к c
В этом разделе описывается, как открывать, закрывать и переключать подключения к базам данных.
36.2.1. Подключение к серверу баз данных #
Подключение к базе данных выполняется следующим оператором:
EXEC SQL CONNECT TOцель-подключения[ASимя-подключения] [USERимя-пользователя];
Цель может задаваться следующими способами:
- имя_бд [ @ имя_сервера ][ : порт ]
- tcp:postgresql:// имя_сервера [ : порт ][ / имя_бд ][ ? параметры ]
- unix:postgresql://localhost[ : порт ][ / имя_бд ][ ? параметры ]
- строковая константа SQL, содержащая одну из вышеприведённых записей
- ссылка на символьную переменную, содержащую одну из вышеприведённых записей (см. примеры)
- DEFAULT
С целью подключения DEFAULT устанавливается подключение к базе данных по умолчанию с именем пользователя по умолчанию. Другое имя пользователя или имя подключения в этом случае указать нельзя.
Если цель подключения задаётся буквально (не в виде текстовой строки и не через переменную), её компоненты разбираются как обычные элементы SQL; это означает, например, что имя_сервера должно выглядеть как один или несколько идентификаторов SQL, разделённых точками, и если они не заключены в кавычки, они будут приведены к нижнему регистру. Значения любых параметров должны быть идентификаторами SQL, целыми числами или ссылками на переменные. Разумеется, практически любую строку можно сделать идентификатором SQL, заключив её в кавычки. На практике же, во избежание ошибок, предпочтительнее использовать текстовые строки (в апострофах) или ссылки на переменные.
Также разными способами можно указать имя пользователя:
- имя_пользователя
- имя_пользователя / пароль
- имя_пользователя IDENTIFIED BY пароль
- имя_пользователя USING пароль
В показанных выше строках имя_пользователя и пароль могут задаваться идентификатором или строковой константой SQL, либо ссылкой на символьную переменную.
Если указание цели подключения включает какие-либо параметры , они должны записываться в виде имя = значение и разделяться амперсандами ( & ). В качестве имён параметров принимаются те же, что поддерживает libpq (см. Подраздел 34.1.2). Перед элементами имя или значение пробелы игнорируются, но сохраняются внутри или после этих элементов. Заметьте, что записать & внутри значения нет никакой возможности.
Обратите внимание, что при указании соединения через сокет (с префиксом unix: ) имя сервера обязательно должно быть localhost . Чтобы выбрать нестандартный каталог сокета, укажите путь к каталогу как значение параметра host в списке параметров в строке цели.
Указание имя-подключения применяется, когда в одной программе нужно использовать несколько подключений. Его можно опустить, если программа работает только с одним подключением. Соединение, открытое последним, становится текущим и будет использоваться по умолчанию при выполнении SQL-операторов (это описывается далее в этой главе).
Вот некоторые примеры оператора CONNECT :
EXEC SQL CONNECT TO mydb@sql.mydomain.com; EXEC SQL CONNECT TO tcp:postgresql://sql.mydomain.com/mydb AS myconnection USER john; EXEC SQL BEGIN DECLARE SECTION; const char *target = "mydb@sql.mydomain.com"; const char *user = "john"; const char *passwd = "secret"; EXEC SQL END DECLARE SECTION; . EXEC SQL CONNECT TO :target USER :user USING :passwd; /* or EXEC SQL CONNECT TO :target USER :user/:passwd; */
В последней форме используется вариант, названный выше ссылкой на символьную переменную. В последующих разделах вы узнаете, как в SQL-операторах можно использовать переменные C, приставляя перед именем двоеточие.
Учтите, что формат цели подключения не описывается в стандарте SQL. Поэтому, если вы хотите разрабатывать переносимые приложения, имеет смысл применить подход, показанный в последнем примере, и сформировать строку подключения отдельно.
Если к базе данных, которая не приведена в соответствие шаблону безопасного использования схем, имеют доступ недоверенные пользователи, начинайте сеанс с удаления схем, доступных всем для записи, из пути поиска ( search_path ). Например, добавьте options=-c search_path= в options или выполните EXEC SQL SELECT pg_catalog.set_config(‘search_path’, », false); после подключения. Это касается не только ECPG, но и любых других интерфейсов для выполнения произвольных SQL-команд.
36.2.2. Выбор подключения #
SQL-операторы в программах со встраиваемым SQL по умолчанию выполняются с текущим подключением, то есть с подключением, которое было открыто последним. Если приложению нужно управлять несколькими подключениями, это можно сделать тремя способами.
Первый вариант — явно выбирать подключение для каждого SQL-оператора, например, так:
EXEC SQL AT имя-подключения SELECT . ;
Этот вариант хорошо подходит для случаев, когда приложению нужно использовать несколько подключений в смешанном порядке.
Если ваше приложение выполняется в нескольких потоках, они не могут использовать подключение одновременно. Поэтому вы должны либо явно управлять доступом (используя мьютексы), либо использовать отдельные подключения для каждого потока.
Второй вариант — выполнять оператор, переключающий текущее подключение. Этот оператор записывается так:
EXEC SQL SET CONNECTION имя-подключения;
Этот вариант особенно удобен, когда с одним подключением нужно выполнить несколько операторов.
Следующий пример программы демонстрирует управление несколькими подключениями к базам данных:
#include EXEC SQL BEGIN DECLARE SECTION; char dbname[1024]; EXEC SQL END DECLARE SECTION; int main() < EXEC SQL CONNECT TO testdb1 AS con1 USER testuser; EXEC SQL SELECT pg_catalog.set_config('search_path', '', false); EXEC SQL COMMIT; EXEC SQL CONNECT TO testdb2 AS con2 USER testuser; EXEC SQL SELECT pg_catalog.set_config('search_path', '', false); EXEC SQL COMMIT; EXEC SQL CONNECT TO testdb3 AS con3 USER testuser; EXEC SQL SELECT pg_catalog.set_config('search_path', '', false); EXEC SQL COMMIT; /* This query would be executed in the last opened database "testdb3". */ EXEC SQL SELECT current_database() INTO :dbname; printf("current=%s (should be testdb3)\n", dbname); /* Using "AT" to run a query in "testdb2" */ EXEC SQL AT con2 SELECT current_database() INTO :dbname; printf("current=%s (should be testdb2)\n", dbname); /* Switch the current connection to "testdb1". */ EXEC SQL SET CONNECTION con1; EXEC SQL SELECT current_database() INTO :dbname; printf("current=%s (should be testdb1)\n", dbname); EXEC SQL DISCONNECT ALL; return 0; >
Этот пример должен вывести следующее:
current=testdb3 (should be testdb3) current=testdb2 (should be testdb2) current=testdb1 (should be testdb1)
Третий вариант заключается в объявлении идентификатора SQL, связанного с подключением. Например:
EXEC SQL ATимя-подключенияDECLAREимя-оператораSTATEMENT; EXEC SQL PREPAREимя-оператораFROM :динамическая-строка;
Связанный с подключением SQL-идентификатор затем нужно выполнять без предложения AT. Обратите внимание, что этот вариант действует как директивы препроцессора, поэтому это связывание будет работать только в рамках файла.
Следующий пример программы демонстрирует использование данного варианта:
#include EXEC SQL BEGIN DECLARE SECTION; char dbname[128]; char *dyn_sql = «SELECT current_database()»; EXEC SQL END DECLARE SECTION; int main()
Этот пример должен вывести следующее, даже если подключение по умолчанию установлено к базе testdb:
postgres
36.2.3. Закрытие подключения #
Чтобы закрыть подключение, примените следующий оператор:
EXEC SQL DISCONNECT [подключение];
Подключение можно задать следующими способами:
Если имя подключения не задано, закрывается текущее подключение.
Хорошим стилем считается, когда приложение явно закрывает каждое подключение, которое оно открыло.
| Пред. | Наверх | След. |
| 36.1. Концепция | Начало | 36.3. Запуск команд SQL |
Подключение к базе данных PostgreSQL
В этом разделе описывается, как подключиться к базе данных PostgreSQL.
На этой странице
- Базовое подключение
- Подключение с помощью SSL-сертификата
Для подключения к экземпляру БД можно использовать клиентский psql для базового подключения или SSL-соединения. Рекомендуется использовать SSL-соединение.
Для подключения необходимы:
- Привязанный к экземпляру БД внешний IP-адрес.
- Установленный клиент PostgreSQL psql на ECS.
Базовое подключение
- Подключитесь к экземпляру виртуальной машины ECS , где развернут экземпляр RDS.
- Запустите следующую команду для подключения к базе данных RDS:
psql --no-readline -U user> -h host> -p port> -d datastore> -W
- -U — имя пользователя экземпляра базы данных RDS. По умолчанию — root .
- -h — IP-адрес экземпляра первичной БД. Получить этот IP-адрес можно на странице Instance Management , нажав на название экземпляра БД.
- через ECS, то IP-адрес можно найти на вкладке Basic Information разделе Connection Information → Floating IP Address .
- через EIP, то адрес IP будет располагаться на вкладке EIPs .
- -p — использующийся порт для базы данных. По умолчанию значение порта — 5432. Номер порта можно получить на странице Instance Management , нажав на нужный экземпляр RDS и перейдя в раздел Connection Information → Database Port .
- -d — название БД. По умолчанию название будет «postgres».
- -W — запрос пароля, который нужно будет указать при подключении. После запуска этой команды будет запрашиваться пароль.
psql --no-readline -U root -h 192.168.0.44 -p 5432 -d postgres -W
Подключение с помощью SSL-сертификата
- Войдите в консоль управления Advanced.
- Инструкция по входу с помощью личного кабинета Cloud.ru
- Инструкция по входу в консоль для IAM-пользователей
Запустите команду для подключения к экземпляру. В нашем примере используется команда для Linux:
psql --no-readline -h host> -p port> "dbname= user= sslmode=verify-ca sslrootcert="
-h — IP-адрес экземпляра первичной БД. Получить этот IP-адрес можно на странице Instance Management , нажав на название экземпляра БД.
Если подключение осуществляется:
- через ECS, то IP-адрес можно найти на вкладке Basic Information разделе Connection Information → Floating IP Address .
- через EIP, то адрес IP будет располагаться на вкладке EIPs .
Например, чтобы подключиться к экземпляру базы данных через SSL-соединение от имени пользователя root, выполните следующую команду:
psql --no-readline -h 192.168.0.44 -p 5432 "dbname=postgres user=root sslmode=verify-ca sslrootcert=/root/ca.pem" Password:
Если успешно установлено SSL-соединение, то отобразится сообщение:
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Как подключить postgresql к c
PgAdmin — это инструмент управления с открытым исходным кодом для баз данных, входящий в загрузку PostgreSQL. Этот инструмент предлагает полную поддержку Юникода, быструю, многопоточную обработку запросов и инструменты редактирования, а также поддержку всех типов объектов PostgreSQL.
4. Создание нового пользователя.
a. Щелкните правой кнопкой мыши PostgreSQLx.x (
b. Выберите New Object > New Login Role . На вкладке Properties в поле Role name введите наименование роли пользователя PostgreSQL для администрирования PostgreSQL.
c. На вкладке Definition введите в поле Password уникальный и надежный пароль для администрирования PostgreSQL (появится подсказка, что нужно ввести его дважды).
Пароль, который не должен легко угадываться или узнаваться, общий пароль, должен иметь длину не менее 14 символов и состоять из смеси прописных и строчных букв, цифр и специальных символов. Необходимо будет повторно ввести этот пароль на последующих шагах.
5. Нажмите кнопку ОК . Запомните наименование роли пользователя, созданное на этом шаге, для дальнейшего использования.
Конфигурирование базы данных PostgreSQL, расположенной на отдельном сервере, а не на сервере ThingWorx
Этот раздел является необязательным для среды разработки, но должен быть реализован во всех производственных средах.
По умолчанию сервер PostgreSQL устанавливается в заблокированном состоянии. Сервер будет прослушивать соединения только с локального компьютера. Чтобы ThingWorx взаимодействовал с сервером PostgreSQL, необходимо внести некоторые изменения в конфигурацию так, чтобы PostgreSQL знал о прослушивании соединений от других пользователей (пользователь ThingWorx, значение по умолчанию: twadmin) и/или от других компьютеров (ThingWorx, установленный на отдельном сервер).
Для выполнения этих шагов необходимо знать, где находится каталог данных PostgreSQL. Для Windows папка данных по умолчанию: C:\Program Files\PostgreSQL\x.x\data .
Измените файл pg_hba.conf и добавьте в зависимости от нужной конфигурации следующие строки:
Если нужно разрешить соединение со всех адресов IPv4:
host all all 0.0.0.0/0 md5
Если нужно разрешить подключение только с определенного адреса IPv4 (замените < ipAddress >IP-адресом компьютера, осуществляющего подключение):
host all all
Если нужно разрешить подключение со всех адресов IPv6:
host all all ::0/0 md5
Если нужно разрешить подключение только с определенного адреса IPv6 (замените
host all all
Возможна любая другая комбинация, если использовать дополнительные строки разрешений (для отдельных IP-адресов или их диапазонов) или маски подсети, соответствующие компьютерам, которым требуется доступ к базе данных PostgreSQL.
После любого изменения этого файла требуется перезапуск сервиса базы данных.
Конфигурирование и выполнение сценария базы данных PostgreSQL
Чтобы настроить базу данных и область таблицы PostgreSQL, необходимо сконфигурировать и выполнить сценарий thingworxPostgresDBSetup .
1. Добавьте папку <папка-установки-postgres>/bin в системную переменную PATH .папка-установки-postgres>
2. Создайте папку с наименованием ThingworxPostgresqlStorage на диске, на котором находится папка ThingworxStorage (по умолчанию — в корневом каталоге). Обратите внимание на следующее.
◦ При создании папки с помощью команды -d
◦ Необходимо указать для опции -l существующий путь. Например, -l D:\ThingworxPostgresqlStorage . В этом сценарии ваша папка не создается.
◦ Для этой папки должен существовать владелец и должны быть заданы соответствующие права доступа. Владельцем этой папки должен быть тот же пользователь, который запускает сервис PostgreSQL, и которому назначены права Full Control; обычно это пользователь NETWORK_SERVICE, но в вашей среде он может быть другим.
4. Если необходимо, сконфигурируйте сценарий. Используйте опции из приведенной ниже таблицы.
Опции сценария thingworxPostgresDBSetup
По умолчанию
tablespace
Наименование области таблицы
-t thingworx
Номер порта PostgreSQL
Наименование создаваемой базы данных PostgreSQL
-d thingworx
Имя хост-компьютера.
-h localhost
tablespace_location
/ThingworxPostgresqlStorage
Требуется. Расположение в файловой системе, где хранятся файлы, представляющие объекты базы данных.
adminusername
Имя администратора
-a postgres
thingworxusername
Имя пользователя, имеющего разрешения на запись в базу данных.
5. Выполните сценарий.
Конфигурирование и выполнение сценария схемы поставщика моделей/данных
Чтобы настроить схему поставщика моделей/данных PostgreSQL, необходимо сконфигурировать и выполнить сценарий thingworxPostgresSchemaSetup . Это позволит настроить общедоступную схему в вашей базе данных для экземпляра PostgreSQL, установленного на локальном компьютере localhost.
2. Если необходимо, сконфигурируйте сценарий. Используйте опции из приведенной ниже таблицы.
Опции сценария thingworxPostgresSchemaSetup
По умолчанию
IP-адрес или наименование хост-компьютера базы данных.
-h localhost
Номер порта PostgreSQL.
Наименование базы данных, которую необходимо использовать.
-d thingworx
Наименование схемы, которую необходимо использовать.
-s mySchema
Имя пользователя для обновления схемы базы данных
Имеются три опции.
• all — настройка схем поставщиков моделей и данных в указанной базе данных.
• model — настройка схемы поставщика моделей в указанной базе данных.
• data — настройка схемы поставщика данных в указанной базе данных.
3. Выполните сценарий.
Конфигурирование файла platform-settings.json
1. Создайте папку ThingworxPlatform в корневом каталоге диска, на котором была установлена Tomcat, или задайте системную переменную среды, которая указывает на эту папку. Обратите внимание на следующее.
◦ Чтобы указать расположение, в котором хранятся настройки ThingWorx, задайте необходимое расположение как значение переменной среды THINGWORX_PLATFORM_SETTINGS . Убедитесь, что папка, на которую ссылается переменная THINGWORX_PLATFORM_SETTINGS , существует и доступна для записи пользователю Tomcat. Эта переменная среды должна быть сконфигурирована в наборе системных переменных среды.
◦ Невозможно будет запустить сервер ThingWorx, если он не будет иметь права на чтение и запись в этой папке.
2. Поместите файл platform-settings.json в папку ThingworxPlatform . Этот файл доступен на сайте загрузки программного обеспечения.
Если сервер PostgreSQL не совпадает с сервером ThingWorx, то при возникновении проблем, связанных с установкой ThingWorx, просмотрите журналы Tomcat и файл platform-settings.json . При стандартной установке предполагается, что оба сервера находятся на одном и том же компьютере.
(Необязательно) Шифрование пароля PostgreSQL
(Необязательно) Установка пакета клиента PostgreSQL и пользователя PostgreSQL
Чтобы выполнить команды PostgreSQL на компьютере клиента для сервера PostgreSQL, выполняйте их от имени пользователя PostgreSQL. Пакет postgresql-client-x.x можно установить на клиентском компьютере. Инструкции по установке см. в документации по дистрибутиву PostgreSQL. Этот пакет содержит некоторые инструменты администрирования, такие как psql .