Ubuntu18.04源码安装PostgreSQL11

最近在看项目源码时候,发现使用了PostgreSQL,发现思路非常之清晰,安装测试下吧

一、Ubuntu18 网络设置不生效问题

本次采用的Ubuntu环境为18.04,Ubuntu18和之前的版本不太一样,我这里出现了网络设置总是出错的问题,最后找到了这篇文章Ubuntu Server 18.04 网络设置不生效的解决,思路是一样的。
首先通过ifconfig查看网卡设置:
Ubuntu18.04源码安装PostgreSQL11_第1张图片
我这里有两个网卡,其实重点设置一个就够了。

新方法修改01-network-manager-all.yaml内容为:

# Let NetworkManager manage all devices on this system
network:
    ethernets:
        enp0s3:
            addresses: []
            dhcp4: true
            optional: true
        enp0s8:
            addresses: []
            dhcp4: true
            optional: true

    version: 2

Ubuntu18.04源码安装PostgreSQL11_第2张图片
之后重启网络: sudo netplan apply
如果网络不正常,则使用sudo netplan --debug apply进行验证查看。
之后网络恢复正常,使用sudo apt update更新即可。

二、PostgreSQL11源码安装

官网下载: https://www.postgresql.org/ftp/source/v11.0/
这里采用了11.0版本,下载解压至Ubuntu特定文件夹,采用下面命令进行安装:

#进入postgreSQL的源码目录
cd postgresql-11.0
#检查环境配置--prefix是指定postgreSQL安装路径,这里使用默认路径/usr/local/pgsql/
./configure
-- 这里会出现错误,readline library not found依赖问题
-- apt-apt install -y libreadline-gplv2-dev后,重新./configure
# 编译(时间有点长)
make

# 安装(root权限)
sudo make install

安装完成后,继续安装源码contrib目录下的一些工具,是第三方组织的一些工具代码,建议安装

cd contrib
make && sudo make install

验证安装是否成功,输入命令:

ls -l /usr/local/pgsql/

如果 bin include lib 和 share都出现,说明安装成功
Ubuntu18.04源码安装PostgreSQL11_第3张图片
添加用户
root 用户不能启动postgresql 所以创建一个普通用户来启动和管理

adduser postgres (会交互输入密码,这里设置为postgres )

赋予 postgres用户相关文件夹权限

#创建postgreSQL数据存放位置
## postgreSQL有些配置文件将数据的存放位置指向 /usr/local/postgresql/data,
## 可以将将数据的存放位置创建在 /usr/local/postgresql下,可以省去后面一些配置的修改
sudo mkdir -p /var/postgresql/data
## 日志存放
sudo mkdir -p /var/postgresql/logs
# 给postgres用户赋予文件夹的所属权限和读写
sudo chown -R postgres:postgres /usr/local/pqsql
sudo chown -R postgres:postgres /var/postgresql

sudo chmod -R 775 /var/postgresql/*

Ubuntu18.04源码安装PostgreSQL11_第4张图片
配置postgres用户环境变量

#切换至postgres用户
su - postgres
#修改配置文件
vim ~/.profile
# 添加以下内容和修改PATH
export PGHOME=/usr/local/pgsql
export PGDATA=/var/postgresql/data
export PGHOST=/tmp
export PATH="$HOME/bin:$HOME/.local/bin:$PATH:$PGHOME/bin"
export MANPATH=$PGHOME/share/man:$MANPATH
export LANG=en_US.utf8
export DATE=`date +"%Y-%m-%d %H:%M:%S"`
export LD_LIBRARY_PATH=$PGHOME/lib:$LD_LIBRARY_PATH
#下面只是启动服务的快捷配置,可不用配置
#alias pg_start='pg_ctl start -D $PGDATA'
#alias pg_stop='pg_ctl stop -D $PGDATA -m fast'

Ubuntu18.04源码安装PostgreSQL11_第5张图片
切换用户后,使用命令psql进入交互式环境:
CREATE USER testuser WITH PASSWORD ‘testuser’;

Ubuntu18.04源码安装PostgreSQL11_第6张图片

\q   退出交互式环境
\h   查看所有sql命令
\?   查看psql命令
\l   查看数据库
\du  查看所有用户
\dt  查看表
SELECT tablename FROM pg_tables;     查看所有表

三、PostgreSQL进阶配置

安装pgAdmin3图形界面来管理Postgresql
#安装pgadmin3
$sudo apt-get install pgadmin3    #postgresql11安装完毕之后进行安装
#运行pgAdmin3 
pgadmin3
添加新用户和新数据库

参考: https://www.bbsmax.com/A/lk5aYjal51/
https://blog.csdn.net/lc_2014c/article/details/84189162

设置远程访问数据库
c/c++连接数据库

参考:

https://blog.csdn.net/zst126/article/details/2608445 (c++ demo)
https://blog.csdn.net/s465689853/article/category/7807189 (postgresql从入门到菜鸟)
重点:
ibpq-PostgreSQL客户端编程接口(一)----libpq中的数据库连接函数
libpq-PostgreSQL客户端编程接口(二)----libpq中的命令执行函数

三个模块:
整理自:postgresql从入门到菜鸟(六)libpq连接postgres数据库
一.获取连接

const char *conninfo;
PGconn     *conn;
conninfo = "host=127.0.0.1 port=5433 dbname=smoondb user=postgres";
conn = PQconnectdb(conninfo);

//判断
 if (PQstatus(conn) != CONNECTION_OK)
 {
        fprintf(stderr, "Connection to database failed: %s",
                PQerrorMessage(conn));
        exit_nicely(conn);//关闭连接并执行清理操作
 }

二.执行select语句
Lipq执行sql命令的核心函数为PQexec(PGconn *conn, const char *command);其中第一个参数为连接。第二个为执行的命令,其中command字符串可以包含多条执行命令,需要注意的是如果不加入begin或者commit的关键字,command字符串中的所有命令将在一个事务中执行,并且只要其中一条失败,就会导致整个command执行失败。
PQexec函数的返回类型为PGresult,如果返回值为null,说明执行失败,可以通过PQerrorMessage()方法查看错误消息。

在libpg中,查询语句和更新语句都是通过PQexec函数执行,但是很明显对于这两种语句我们需要的返回值肯定不同,所以在解析PGresult时,libpq提供了不同的解析函数,这部分先说说解析查询结果用到的几个函数

PQnfields(PGresult *res):用于获取结果集中列的数目
PQfname(PGresult *res,int i):用于获取结果集中列的名称
PQntuples(PGresult *res):用于获取结果集中行的数目
PQgetvalue(PGresult *res,int i,int j):用于获取结果集中i行j列的值

	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);
    }
    //这里需要注意不再使用的PGresult需要及时释放,否则可能会造成内存泄漏
    PQclear(res);

    res = PQexec(conn, "FETCH ALL in myportal");//FETCH ALL表示从结果中取回全部数据
    if (PQresultStatus(res) != PGRES_TUPLES_OK)
    {
        fprintf(stderr, "FETCH ALL failed: %s", PQerrorMessage(conn));
        PQclear(res);
        exit_nicely(conn);
    }

    // 首先,打印出列名
    nFields = PQnfields(res);
    for (i = 0; i < nFields; i++)
        printf("%-15s", PQfname(res, i));
    printf("\n\n");

    // 接下来,打印出行 
    for (i = 0; i < PQntuples(res); i++)
    {
        for (j = 0; j < nFields; j++)
            printf("%-15s", PQgetvalue(res, i, j));//打印值
        printf("\n");
    }

    PQclear(res);

三.执行insert,delete,update语句
对于select语句,我们在解析PGresult时需要的是结果集,所以在上面调用了以上几个函数,但是修改语句我们更关心的受影响的行数,所以对于修改语句可以通过PQntuples(const PGresult *res)获取受影响函数,其中对于PGresult而言它的成员中包含了所有执行的结果,不同的解析函数只是用来取得PGresult中相应的成员而已,有兴趣的同学可以去看一看PGresult结构体的实现,里面对于所有的成员都有比较清楚的描述。
下面贴一段执行插入语句的例子:

    res = PQexec(conn, "delete from student where sid=4;");
    if (PQresultStatus(res) != PGRES_COMMAND_OK)
    {
        fprintf(stderr, "delete failed: %s", PQerrorMessage(conn));
        PQclear(res);
        exit_nicely(conn);
    }
    printf("updatelin:%s",PQcmdTuples(res));//解析并打印受影响行数
    PQclear(res);


你可能感兴趣的:(C++/STL)