psql数据库学习与使用

目录

0 psql简介

2.3控制台命令

2.5数据库导入导出

2.6 问题解决

3.API使用

3.0  libpqxx编译

3.2 连接示例

3.3 创建表示例

3.4 增加示例

3.5 选择示例

3.6 修改示例

3.7 删除示例

5.资料参考:


0 psql简介

在数据库术语里,PostgreSQL使用一种客户端/服务器的模型。一次PostgreSQL会话由下列相关的进程(程序)组成:

1.一个服务器进程,它管理数据库文件、接受来自客户端应用与数据库的联接并且代表客户端在数据库上执行操作。 该数据库服务器程序叫做postgres。

2.那些需要执行数据库操作的用户的客户端应用。

PostgreSQL服务器可以处理来自客户端的多个并发请求。 因此,它为每个连接启动(“forks”)一个新的进程

1.psql安装

Ubuntu安装:

安装PostgreSQL客户端。

sudo apt-get install postgresql-client

安装PostgreSQL服务器

sudo apt-get install postgresql

正常情况下,安装完成后,PostgreSQL服务器会自动在本机的5432端口开启。

Centos安装:

PostgreSQL: Linux downloads (Red Hat family) 

默认会创建名为"postgres"的Linux用户和数据库账号和数据库名

2.1 基础命令行

2.1.1 登录数据库

使用psql命令登录数据库的命令为:

psql -U dbuser -d exampledb -h 127.0.0.1 -p 5432

上面命令的参数含义如下:-U指定用户,-d指定数据库,-h指定服务器,-p指定端口。

输入上面命令以后,系统会提示输入dbuser用户的密码。

psql数据库学习与使用

 账户:psql  -U postgres   -d  postgres

psql数据库学习与使用

 2.1.2 添加新用户和新数据库

步骤1:设定密码postgres密码

\password postgres

步骤2:创建数据库用户dbuser(刚才创建的是Linux系统用户),并设置密码

CREATE USER dbuser WITH PASSWORD 'password'; 

psql数据库学习与使用

 步骤3:创建用户数据库,这里为exampledb,并指定所有者为dbuser。

CREATE DATABASE exampledb OWNER dbuser;

psql数据库学习与使用

步骤4:将exampledb数据库的所有权限都赋予dbuser,否则dbuser只能登录控制台,没有任何数据库操作权限。

GRANT ALL PRIVILEGES ON DATABASE exampledb to dbuser;

步骤5:退出

\q

2.3控制台命令

命令行

含义

备注

\h

查看SQL命令的解释

比如\h select。

\?

查看psql命令列表

\?

\l

列出所有数据库

\l

\c

连接其他数据库

\c [database_name]

\d

列出当前数据库的所有表格

\d

\d

列出某一张表格的结构

\d [table_name]

\du

列出所有用户

\du

\e

打开文本编辑器

\e

\conninfo

列出当前数据库和连接的信息

\conninfo

2.4 数据库操作

命令行

含义

备注

CREATE

创建新表

CREATE TABLE user_tbl(name VARCHAR(20), signup_date DATE);

INSERT

插入数据

INSERT INTO user_tbl(name, signup_date) VALUES('张三', '2013-12-22');

SELECT

选择记录

SELECT * FROM user_tbl;

UPDATE

更新数据

UPDATE user_tbl set name = '李四' WHERE name = '张三';

DELETE

删除记录

DELETE FROM user_tbl WHERE name = '李四' ;

ALTER

添加栏位

ALTER TABLE user_tbl ADD email VARCHAR(40);

更新结构

ALTER TABLE user_tbl ALTER COLUMN signup_date SET NOT NULL;

更名栏位

ALTER TABLE user_tbl RENAME COLUMN signup_date TO signup;

删除栏位

ALTER TABLE user_tbl DROP COLUMN email;

表格更名

ALTER TABLE user_tbl RENAME TO backup_tbl;

DROP

删除表格

TABLE IF EXISTS backup_tbl;

2.5数据库导入导出

展示没有使用到

2.6 问题解决

psql数据库学习与使用

解决:
步骤1:#将文件Database administrative 下列中的peer改为trust

vi  /etc/postgresql/14/main/pg_hba.conf

psql数据库学习与使用

步骤2:sudo service postgresql restart

psql数据库学习与使用

3.API使用

可以参考大佬博文:

C/C++连接PostgreSQL数据库 -PostgreSQL教程™

PostgreSQL连接C/C++接口实例

3.0  libpqxx编译

wget http://pqxx.org/download/software/libpqxx/libpqxx-4.0.1.tar.gz
tar -xzf libpqxx-4.0.1.tar.gz
cd libpqxx-4.0.1
./configure --prefix=/usr/local --enable-shared
make && make install

Centos编译问题:

PostgreSQL - pg_config -bash: pg_config: command not found

解决:

yum install postgresql-devel

3.1 常用API操作

S.N.

API & 描述

1

pqxx::connection C( const std::string & dbstring ) yiibai.com

这是将用于连接到数据库一个类型定义。这里dbstring提供所需要的参数,例如连接到数据库 dbname=postgres user=postgres password=Hik123456 hostaddr=127.0.0.1 port=7017

如果连接设置成功,那么它创建C与连接对象提供各种有用的函数公共函数。

2

C.is_open()

is_open()是一个连接对象的公共方法,并返回布尔值。如果连接处于活动状态,则此方法返回true,否则返回false。

3

C.disconnect()

使用此方法打开的数据库连接断开。

4

pqxx::work W( C )

这是一个类型定义将用于创建一个事务对象,使用C连接方式,最终将被用于执行SQL语句的事务模式。

如果交易对象被创建成功,那么它被分配到变量W,这将被用来访问相关的事务性对象的公共方法。 

5

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

这种从事务对象的公共方法将被用于执行SQL语句。 

6

W.commit()

这种从事务对象的公共方法将用于提交事务。

7

W.abort()

这种从事务对象的公共方法将用于回滚事务。 

8

pqxx::nontransaction N( C )

这是一个类型定义,被用来创建使用C连接方式,最终将被用于在非事务性模式下执行SQL语句的非事务性对象。

如果交易对象被创建成功,那么它被分配到变量N将用于访问相关的非事务性对象的公共方法。

9

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

从非事务性对象的公共方法将被用于执行SQL语句,并返回一个结果对象,这实际上是一个的迭代器返回的记录。

3.2 连接示例

连接数据库

示例:

#include <iostream>
#include <pqxx/pqxx>

using namespace std;
using namespace pqxx;

int main(int argc, char* argv[])
{
   try{
      connection C("dbname=postgres user=postgres password=Hik123456 \
      hostaddr=127.0.0.1 port=7017");
      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;
   }
}

运行结果:

psql数据库学习与使用

3.3 创建表示例

创建的数据库中创建一个表

运行示例:

#include <iostream>
#include <pqxx/pqxx>

using namespace std;
using namespace pqxx;

int main(int argc, char* argv[])
{
   char * sql;
   try{
      connection C("dbname=postgres user=postgres password=Hik123456 \
      hostaddr=127.0.0.1 port=7017");

      if (C.is_open()) {
         cout << "Opened database successfully: " << C.dbname() << endl;
      } else {
         cout << "Can't open database" << endl;
         return 1;
      }
      /* Create SQL statement */
      sql = "CREATE TABLE COMPANY("  \
      "ID INT PRIMARY KEY     NOT NULL," \
      "NAME           TEXT    NOT NULL," \
      "AGE            INT     NOT NULL," \
      "ADDRESS        CHAR(50)," \
      "SALARY         REAL );";

      /* Create a transactional object. */
      work W(C);
      /* Execute SQL query */
      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;
}

运行结果:

psql数据库学习与使用

服务端:

psql数据库学习与使用

3.4 增加示例

创建的数据库中向company表内插入项

示例:

#include <iostream>
#include <pqxx/pqxx>

using namespace std;
using namespace pqxx;


int main(int argc, char* argv[])
{
   char * sql;
   try{
    connection C("dbname=postgres user=postgres password=Hik123456 \
      hostaddr=127.0.0.1 port=7017");

      if (C.is_open()) {
         cout << "Opened database successfully: " << C.dbname() << endl;
      } else {
         cout << "Can't open database" << endl;
         return 1;
      }

      /* Create SQL statement */

      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 );";

      /* Create a transactional object. */
      work W(C);
      /* Execute SQL query */

      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;

}

运行结果:

psql数据库学习与使用

 

数据库:

psql数据库学习与使用

 

3.5 选择示例

查询创建的数据库中表中内容

示例:

#include <iostream>

#include <pqxx/pqxx>

using namespace std;

using namespace pqxx;



int main(int argc, char* argv[])

{

   char * sql;

   try{

    connection C("dbname=postgres user=postgres password=Hik123456 \

      hostaddr=127.0.0.1 port=7017");



      if (C.is_open()) {

         cout << "Opened database successfully: " << C.dbname() << endl;

      } else {

         cout << "Can't open database" << endl;

         return 1;

      }

      /* Create SQL statement */

      sql = "SELECT * from COMPANY";



      /* Create a non-transactional object. */

      nontransaction N(C);



      /* Execute SQL query */

      result R( N.exec( sql ));



      /* List down all the records */

      for (result::const_iterator c = R.begin(); c != R.end(); ++c) {

         cout << "ID = " << c[0].as<int>() << endl;

         cout << "Name = " << c[1].as<string>() << endl;

         cout << "Age = " << c[2].as<int>() << endl;

         cout << "Address = " << c[3].as<string>() << endl;

         cout << "Salary = " << c[4].as<float>() << endl;

      }

      cout << "Operation done successfully" << endl;

      C.disconnect ();

   }catch (const std::exception &e){

      cerr << e.what() << std::endl;

      return 1;

   }



   return 0;

}

运行结果:

psql数据库学习与使用

 

3.6 修改示例

创建的数据库中修改一个表

示例:

#include <iostream>

#include <pqxx/pqxx>



using namespace std;

using namespace pqxx;



int main(int argc, char* argv[])

{

   char * sql;



   try{

   connection C("dbname=postgres user=postgres password=Hik123456 \

      hostaddr=127.0.0.1 port=7017");



      if (C.is_open()) {

         cout << "Opened database successfully: " << C.dbname() << endl;

      } else {

         cout << "Can't open database" << endl;

         return 1;

      }



      /* Create a transactional object. */

      work W(C);

      /* Create  SQL UPDATE statement */

      sql = "UPDATE COMPANY set SALARY = 25000.00 where ID=1";

      /* Execute SQL query */

      W.exec( sql );

      W.commit();

      cout << "Records updated successfully" << endl;



      /* Create SQL SELECT statement */

      sql = "SELECT * from COMPANY";



      /* Create a non-transactional object. */

      nontransaction N(C);



      /* Execute SQL query */

      result R( N.exec( sql ));



      /* List down all the records */

      for (result::const_iterator c = R.begin(); c != R.end(); ++c) {

         cout << "ID = " << c[0].as<int>() << endl;

         cout << "Name = " << c[1].as<string>() << endl;

         cout << "Age = " << c[2].as<int>() << endl;

         cout << "Address = " << c[3].as<string>() << endl;

         cout << "Salary = " << c[4].as<float>() << endl;

      }

      cout << "Operation done successfully" << endl;

      C.disconnect ();

   }catch (const std::exception &e){

      cerr << e.what() << std::endl;

      return 1;

   }



   return 0;

}

运行结果:

psql数据库学习与使用

 

数据库:

psql数据库学习与使用

 

3.7 删除示例

创建的数据库中删除一个表中的条项

示例:

#include <iostream>

#include <pqxx/pqxx>

using namespace std;

using namespace pqxx;

int main(int argc, char* argv[])

{

   char * sql;

   try{

      connection C("dbname=postgres user=postgres password=Hik123456 \

      hostaddr=127.0.0.1 port=7017");



      if (C.is_open()) {

         cout << "Opened database successfully: " << C.dbname() << endl;

      } else {

         cout << "Can't open database" << endl;

         return 1;

      }



      /* Create a transactional object. */

      work W(C);

      /* Create  SQL DELETE statement */

      sql = "DELETE from COMPANY where ID = 2";

      /* Execute SQL query */

      W.exec( sql );

      W.commit();

      cout << "Records deleted successfully" << endl;



      /* Create SQL SELECT statement */

      sql = "SELECT * from COMPANY";



      /* Create a non-transactional object. */

      nontransaction N(C);



      /* Execute SQL query */

      result R( N.exec( sql ));



      /* List down all the records */

      for (result::const_iterator c = R.begin(); c != R.end(); ++c) {

         cout << "ID = " << c[0].as<int>() << endl;

         cout << "Name = " << c[1].as<string>() << endl;

         cout << "Age = " << c[2].as<int>() << endl;

         cout << "Address = " << c[3].as<string>() << endl;

         cout << "Salary = " << c[4].as<float>() << endl;

      }

      cout << "Operation done successfully" << endl;

      C.disconnect ();

   }catch (const std::exception &e){

      cerr << e.what() << std::endl;

      return 1;

   }

   return 0;

}

运行结果:

psql数据库学习与使用

数据库:

psql数据库学习与使用

 4.客户端显示

HeidiSQL_HeidiSQL是一款用于简单化迷你的 MySQL 服务器和数据库管理的图形化界面

使用步骤:

步骤1:打开软件,输入主机与端口,及其用户名和密码

步骤2:选择数据表,查看

5.资料参考:

PostgreSQL: The world's most advanced open source database 

postgresql常见命令及操作 - 单曲荨环 - 博客园 

http://www.postgres.cn/docs/10/intro-whatis.html 

PostgreSQL新手入门 - 阮一峰的网络日志 

PostgreSQL ABORT 

https://github.com/postgres-cn/pgdoc-cn 

上一篇:postgis_raster 从 2.x 升级至 3.x


下一篇:[Cocos Creator] 定时器