bash shell指令碼訪問PostgreSQL的三種方式

劍西樓發表於2017-02-17

bash指令碼里有三種方式訪問PostgreSQL資料庫

但前提是要設定密碼檔案。當然對於有系統對應賬戶的資料庫角色可以繞過密碼登入環節,如

1
$ sudo -u postgres psql

1
2
$ sudo su - postgres
$ psql

但是對於沒有系統賬戶對應的資料庫角色,如要使用指令碼登入則必須使用PostgreSQL密碼檔案

  • heredoc方式

    heredoc是一種很常用的方式,在bash環境下還可以使用變數替換,用法示例

    1
    2
    3
    psql -U ${role} -h ${host} -d mydb << EOF
        CREATE SCHEMA ${role};
    EOF

    也可以在迴圈語句中,向資料庫批量插入資料,類似

    1
    2
    3
    4
    5
    6
    for ...
    do
    psql -U ${role} -h ${host} -d mydb << EOF
        INSERT INTO ${table} VALUES(${value1},${value2},...);
    EOF
    done

    但這種方式,每次插入一條語句都重新登入一次資料庫,效率肯定不咋地。
    UPDATE(05/05/2014):既然可以使用變數替換,可以將所有插入語句組合到一個變數中,然後就可以在一次登入中批量插入資料了。

    還可以用以下方式來獲取查詢結果

    1
    2
    3
    4
    5
    result=`psql -U role -h localhost -d mydb << EOF
        SELECT * FROM products;
    EOF`
     
    echo ${result}
  • 使用psql命令列選項-f執行sql指令碼檔案
    1
    psql -U ${role} -h ${host} -d mydb -f ${scriptname}
  • 使用psql命令列選項-c執行SQL語句或psql命令

    psql的-c選項可以指定SQL語句或者psql命令,但二者不能混合,除非使用管道。如果命令引數中有多條SQL語句,則它們在一個事務裡執行,除非使用BEGIN/COMMIT明確的指定事務。這與互動式使用psql終端不同,如果不明確指定事務,則每條SQL屬於一個單獨的事務並自動提交。只有最後一條SQL語句的結果被返回。
    詳見psql(1)。

可以看出,雖然有三種方式,但其實都是利用了PostgreSQL提供的外部命令psql,所以更復雜的資料庫操作可以考慮使用Python

P.S.
事實證明用bash指令碼插入大量資料,其效率相當低下,3510行的兩個簡單欄位的資料竟然用了4分多種。

===
評斷一個國家的品格,不僅要看它培養了什麼樣的人民,還要看它的人民選擇對什麼樣的人致敬,對什麼樣的人追懷。 —— 約翰·肯尼迪

原連結:http://openwares.net/database/bash_access_postgresql.html

相關文章