Ubuntu18.04源碼安裝PostgreSQL11

最近在看項目源碼時候,發現使用了PostgreSQL,發現思路非常之清晰,安裝測試下吧

一、Ubuntu18 網絡設置不生效問題

本次採用的Ubuntu環境爲18.04,Ubuntu18和之前的版本不太一樣,我這裏出現了網絡設置總是出錯的問題,最後找到了這篇文章Ubuntu Server 18.04 網絡設置不生效的解決,思路是一樣的。
首先通過ifconfig查看網卡設置:
在這裏插入圖片描述
我這裏有兩個網卡,其實重點設置一個就夠了。

新方法修改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

在這裏插入圖片描述
之後重啓網絡: 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都出現,說明安裝成功
在這裏插入圖片描述
添加用戶
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/*

在這裏插入圖片描述
配置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'

在這裏插入圖片描述
切換用戶後,使用命令psql進入交互式環境:
CREATE USER testuser WITH PASSWORD ‘testuser’;

在這裏插入圖片描述

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章