English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutorial básico PostgreSQL

Tutorial avançado PostgreSQL

Interface PostgreSQL

PostgreSQL C/C++ interface

Este tutorial usará a biblioteca libpqxx, que é a interface oficial C do PostgreSQL ++API de cliente. O código-fonte do libpqxx está disponível sob a licença BSD, portanto você pode baixá-lo gratuitamente, passá-lo a outros, modificá-lo, vendê-lo, incluí-lo em seu código e compartilhá-lo com qualquer pessoa que você escolher.

instalação

A versão mais recente do libpqxx pode ser baixada através do link de download do libpqxx (Download do Libpqxx). Portanto, baixe a versão mais recente e siga os seguintes passos-

wget http://pqxx.org/download/software/libpqxx/libpqxx-4.0.tar.gz
tar xvfz libpqxx-4.0.tar.gz
cd libpqxx-4.0
./configure
make
make install

Antes de começar a usar C / C ++ Antes de usar a interface PostgreSQL, encontre o arquivo pg_hba.conf no diretório de instalação do PostgreSQL e adicione as seguintes linhas-

# IPv4 Conexões locais:
host all all         127.0.0.1/32          md5

Se o servidor postgres não estiver em execução, você pode usar o seguinte comando para iniciá-lo/Reiniciando o servidor postgres-

[root@host]# service postgresql restart
Parando o serviço postgresql: [...] [OK]
Iniciando o serviço postgresql: [...] [OK]

C/C++ APIs de interface

A seguir estão os procedimentos de interface importantes, que podem atender às suas necessidades de C/C++A necessidade de usar o banco de dados PostgreSQL no programa. Se você está procurando por uma aplicação mais complexa, você pode consultar a documentação oficial da libpqxx ou usar APIs disponíveis comercialmente.

N.ºAPI & Descrição
1

pqxx::connection C( const std::string & dbstring )

Este é um typedef que será usado para conectar ao banco de dados. Aqui, dbstring fornece os parâmetros necessários para conectar ao banco de dados, por exemplo:

dbname = testdb user = postgres password=pass123 hostaddr=127.0.0.1 port=5432.

Se a conexão for estabelecida com sucesso, ela cria um objeto C com o objeto de conexão, fornecendo várias funções públicas úteis.

2

C.is_open()

O método is_open() é um método público do objeto de conexão e retorna um valor booleano. Se a conexão estiver ativa, este método retorna true, caso contrário, retorna false.

3

C.disconnect()

Este método é usado para desconectar a conexão de banco de dados aberta.

4

pqxx::work W( C )

Este é um typedef para criar um objeto transacional usando a conexão C, que será usado para executar instruções SQL em modo transacional.

Se o objeto transacional for criado com sucesso, ele será atribuído à variável W, que será usada para acessar os métodos públicos do objeto transacional.

5

W.exec(const std::string & sql)

Este método público do objeto transacional será usado para executar instruções SQL.

6

W.commit()

Este método público do objeto transacional será usado para commit a transação.

7

W.abort()

Este método público do objeto transacional será usado para rollback a transação.

8

pqxx::nontransaction N( C )

Este é um typedef que será usado para criar objetos não transacionais usando a conexão C, que eventualmente será usado para executar instruções SQL em modo não transacional.

Se o objeto transacional for criado com sucesso, ele será atribuído à variável N, que será usada para acessar os métodos públicos do objeto não transacional.

9

N.exec(const std::string & sql)

Este método público de um objeto não transacional será usado para executar instruções SQL e retornar um objeto result, que é na verdade um iterator que armazena todos os registros retornados.

Conectar ao banco de dados

O código C abaixo mostra como conectar a um banco de dados na porta5432do banco de dados existente executando no meu computador local. Aqui, uso a barra invertida \ para a continuidade das linhas.

#include <iostream>
#include <pqxx/pqxx> 
using namespace std;
using namespace pqxx;
int main(int argc, char* argv[]) {
   try {
      connection C("dbname = testdb user = postgres password = cohondob \
      hostaddr = 127.0.0.1 port = 5432");
      if (C.is_open()) {
         cout << "Opened database successfully: " << C.dbname() << endl;
      } else {
         cout << "Can't open database" << endl;
         return 1;
      }
      C.disconnect();
   } catch (const std::exception &e) {
      cerr << e.what() << std::endl;
      return 1;
   }
}

Agora, vamos compilar e executar o programa acima para nos conectar ao nosso banco de dados testdb, que já está disponível no seu esquema, e pode ser acessado com o usuário postgres e a senha pass123o acesso.}

Você pode usar o ID de usuário e a senha conforme a configuração do banco de dados. Lembre-se de manter-lpqxx e-A ordem lpq deve ser mantida! Caso contrário, o conectador considera que falta o nome e usa funções começando com "PQ".

$g++ test.cpp -lpqxx -lpq
$./a.out
Banco de dados aberto com sucesso: testdb

Criar tabela

O código C a seguir será usado para criar a tabela no banco de dados criado anteriormente-

#include <iostream>
#include <pqxx/pqxx> 
using namespace std;
using namespace pqxx;
int main(int argc, char* argv[]) {
   char * sql;
   
   try {
      connection C("dbname = testdb user = postgres password = cohondob \
      hostaddr = 127.0.0.1 port = 5432");
      if (C.is_open()) {
         cout << "Opened database successfully: " << C.dbname() << endl;
      } else {
         cout << "Can't open database" << endl;
         return 1;
      }
      /* Criar instrução SQL */
      sql = "CREATE TABLE COMPANY(" \
      "ID INT PRIMARY KEY NOT NULL," \
      "NAME TEXT NOT NULL," \
      "AGE INT NOT NULL," \
      "ADDRESS CHAR(50)," \
      "SALARY REAL);";
      /* Criar objeto de transação. */
      work W(C);
      
      /* Executar consulta SQL */
      W.exec(sql);
      W.commit();
      cout << "Table created successfully" << endl;
      C.disconnect();
   } catch (const std::exception &e) {
      cerr << e.what() << std::endl;
      return 1;
   }
   return 0;
}

Quando compilado e executado o programa acima fornecido, ele criará a tabela COMPANY no banco de dados testdb e exibirá a seguinte instrução-

Banco de dados aberto com sucesso: testdb
Tabela criada com sucesso

Operação INSERT

O código C a seguir mostra como criar registros na tabela company criada no exemplo acima-

#include <iostream>
#include <pqxx/pqxx> 
using namespace std;
using namespace pqxx;
int main(int argc, char* argv[]) {
   char * sql;
   
   try {
      connection C("dbname = testdb user = postgres password = cohondob \
      hostaddr = 127.0.0.1 port = 5432");
      if (C.is_open()) {
         cout << "Opened database successfully: " << C.dbname() << endl;
      } else {
         cout << "Can't open database" << endl;
         return 1;
      }
      /* Criar instrução SQL */
      sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "\
         "VALUES (1, 'Paul', 32, 'California', 20000.00 ); "\
         "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "\
         "VALUES (2, 'Allen', 25, 'Texas', 15000.00 ); "\
         "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \
         "VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );" \
         "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \
         "VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );";
      /* Criar objeto de transação. */
      work W(C);
      
      /* Executar consulta SQL */
      W.exec(sql);
      W.commit();
      cout << "Records created successfully" << endl;
      C.disconnect();
   } catch (const std::exception &e) {
      cerr << e.what() << std::endl;
      return 1;
   }
   return 0;
}

Quando compilado e executado o programa acima fornecido, ele criará o registro fornecido na tabela COMPANY e exibirá as duas linhas a seguir-

Banco de dados aberto com sucesso: testdb
Registros criados com sucesso

Operação SELECT

O seguinte trecho de código C mostra como obter e exibir registros da tabela COMPANY criada no exemplo acima

#include <iostream>
#include <pqxx/pqxx> 
using namespace std;
using namespace pqxx;
int main(int argc, char* argv[]) {
   char * sql;
   
   try {
      connection C("dbname = testdb user = postgres password = cohondob \
      hostaddr = 127.0.0.1 port = 5432");
      if (C.is_open()) {
         cout << "Opened database successfully: " << C.dbname() << endl;
      } else {
         cout << "Can't open database" << endl;
         return 1;
      }
      /* Criar instrução SQL */
      sql = "SELECT * from COMPANY";
      /* criar objeto não transacional. */
      nontransaction N(C);
      
      /* executar consulta SQL */
      result R(N.exec(sql));
      
      /* listar todos os registros */
      for (result::const_iterator c = R.begin(); c != R.end(); ++c) {
         cout << "ID = " << c[0].as<int>() << endl;
         cout << "Nome = " << c[1].as<string>() << endl;
         cout << "Idade = " << c[2].as<int>() << endl;
         cout << "Endereço = " << c[3].as<string>() << endl;
         cout << "Salário = " << c[4].as<float>() << endl;
      }
      cout << "Operação concluída com sucesso" << endl;
      C.disconnect();
   } catch (const std::exception &e) {
      cerr << e.what() << std::endl;
      return 1;
   }
   return 0;
}

Quando compilar e executar o programa acima fornecido, ele produzirá os seguintes resultados-

Banco de dados aberto com sucesso: testdb
ID = 1
Nome = Paul
Idade = 32
Endereço = California
Salário = 20000
ID = 2
Nome = Allen
Idade = 25
Endereço = Texas
Salário = 15000
ID = 3
Nome = Teddy
Idade = 23
Endereço = Norway
Salário = 20000
ID = 4
Nome = Mark
Idade = 25
Endereço = Rich-Mond
Salário = 65000
Operação concluída com sucesso

Operação UPDATE

O seguinte trecho de código C mostra como usar a instrução UPDATE para atualizar qualquer registro e, em seguida, da tabela COMPANY-Obter e exibir os registros atualizados

#include <iostream>
#include <pqxx/pqxx> 
using namespace std;
using namespace pqxx;
int main(int argc, char* argv[]) {
   char * sql;
   
   try {
      connection C("dbname = testdb user = postgres password = cohondob \
      hostaddr = 127.0.0.1 port = 5432");
      if (C.is_open()) {
         cout << "Opened database successfully: " << C.dbname() << endl;
      } else {
         cout << "Can't open database" << endl;
         return 1;
      }
      
      /* Criar objeto de transação. */
      work W(C);
      /* Criar instrução SQL UPDATE */
      sql = "UPDATE COMPANY set SALARY =" 25000.00 where ID=1";
      /* Executar consulta SQL */
      W.exec(sql);
      W.commit();
      cout << "Records updated successfully" << endl;
      
      /* Criar uma instrução SQL SELECT */
      sql = "SELECT * from COMPANY";
      /* Criar um objeto não transacional. */
      nontransaction N(C);
      
      /* executar consulta SQL */
      result R(N.exec(sql));
      
      /* listar todos os registros */
      for (result::const_iterator c = R.begin(); c != R.end(); ++c) {
         cout << "ID = " << c[0].as<int>() << endl;
         cout << "Nome = " << c[1].as<string>() << endl;
         cout << "Idade = " << c[2].as<int>() << endl;
         cout << "Endereço = " << c[3].as<string>() << endl;
         cout << "Salário = " << c[4].as<float>() << endl;
      }
      cout << "Operação concluída com sucesso" << endl;
      C.disconnect();
   } catch (const std::exception &e) {
      cerr << e.what() << std::endl;
      return 1;
   }
   return 0;
}

Quando o programa acima for compilado e executado, ele produzirá os seguintes resultados-

Banco de dados aberto com sucesso: testdb
Registros atualizados com sucesso
ID = 2
Nome = Allen
Idade = 25
Endereço = Texas
Salário = 15000
ID = 3
Nome = Teddy
Idade = 23
Endereço = Norway
Salário = 20000
ID = 4
Nome = Mark
Idade = 25
Endereço = Rich-Mond
Salário = 65000
ID = 1
Nome = Paul
Idade = 32
Endereço = California
Salário = 25000
Operação concluída com sucesso

Operação DELETE

O seguinte trecho de código C mostra como usar a instrução DELETE para excluir qualquer registro e, em seguida, da tabela COMPANY-obter e exibir os registros restantes

#include <iostream>
#include <pqxx/pqxx> 
using namespace std;
using namespace pqxx;
int main(int argc, char* argv[]) {
   char * sql;
   
   try {
      connection C("dbname = testdb user = postgres password = cohondob \
      hostaddr = 127.0.0.1 port = 5432");
      if (C.is_open()) {
         cout << "Opened database successfully: " << C.dbname() << endl;
      } else {
         cout << "Can't open database" << endl;
         return 1;
      }
      
      /* Criar objeto de transação. */
      work W(C);
      /* Criar uma instrução SQL DELETE */
      sql = "DELETE from COMPANY where ID =" 2";
      /* executar consulta SQL */
      W.exec(sql);
      W.commit();
      cout << "Registros deletados com sucesso" << endl;
      
      /* Criar declaração SELECT SQL */
      sql = "SELECT * from COMPANY";
      /* criar objeto não transacional. */
      nontransaction N(C);
      
      /* executar consulta SQL */
      result R(N.exec(sql));
      
      /* listar todos os registros */
      for (result::const_iterator c = R.begin(); c != R.end(); ++c) {
         cout << "ID = " << c[0].as<int>() << endl;
         cout << "Nome = " << c[1].as<string>() << endl;
         cout << "Idade = " << c[2].as<int>() << endl;
         cout << "Endereço = " << c[3].as<string>() << endl;
         cout << "Salário = " << c[4].as<float>() << endl;
      }
      cout << "Operação concluída com sucesso" << endl;
      C.disconnect();
   } catch (const std::exception &e) {
      cerr << e.what() << std::endl;
      return 1;
   }
   return 0;
}

Quando compilar e executar o programa acima fornecido, ele produzirá os seguintes resultados-

Banco de dados aberto com sucesso: testdb
Registros deletados com sucesso
ID = 3
Nome = Teddy
Idade = 23
Endereço = Norway
Salário = 20000
ID = 4
Nome = Mark
Idade = 25
Endereço = Rich-Mond
Salário = 65000
ID = 1
Nome = Paul
Idade = 32
Endereço = California
Salário = 25000
Operação concluída com sucesso