將外部應用程式連接至 PostgreSQL 部署

您的應用程式及驅動程式會使用連線字串來建立與 IBM Cloud® Databases for PostgreSQL的連線。 該服務特別為驅動程式和應用程式提供連線字串。 連線字串會顯示在部署 概觀的 端點 畫面中,也可以從 Cloud Databases CLI 外掛程式 及 Cloud Databases API 中擷取。

您在部署上建立的任何認證都可以使用連線字串。 雖然您可以將管理使用者用於所有連線及應用程式,但最好特別建立使用者,讓您的應用程式可以連接。 有關詳細信息,請參閱 獲取連接字串。

使用語言的驅動程式連接至 PostgreSQL 部署

驅動程式建立與部署的連線所需的所有資訊都位於連線字串的 "postgres" 區段中。 表格包含參照的明細。

postgres/URI 連接訊息
欄位名稱 索引 說明
Type 連線類型 - PostgreSQL, 是「URI」。
Scheme URI 的方案 - PostgreSQL, 是 "postgresql"。
Path URI 的路徑 - 對於PostgreSQL,它是資料庫名稱。 預設為 ibmclouddb。
Authentication Username 您用來連接的使用者名稱。
Authentication Password 使用者的密碼-可能顯示為 $PASSWORD
Authentication Method 如何進行鑑別; 由驅動程式處理「直接」鑑別。
Hosts 0... 要連線的主機名稱和連接埠。
Composed 0... 結合 Scheme、Authentication、Host 和 Path 的 URI。
Certificate Name 用於資料庫部署的服務專屬憑證的已分配名稱。
Certificate Base64 憑證的 base64 編碼版本。
  • 0... 表示陣列中可能有一或多個這些項目。

當在連線資訊的 "composed" 欄位中找到 URI 格式的連線字串時,許多 PostgreSQL 驅動程式都可以建立與部署的連線。 例如,

postgres://ibm_cloud_30399dec_4835_4967_a23d_30587a08d9a8:$PASSWORD@981ac415-5a35-4ac7-b6bb-fb609326dc42.8f7bfd8f3faa4218aec56e069eb46187.databases.appdomain.cloud:32704/ibmclouddb?sslmode=verify-full

下列範例使用連線字串及 Java 驅動程式 jdbc 中的資訊來連接至資料庫。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import java.util.logging.*;

public class PGConnect {

    private final static Logger LOGGER = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME);

    private Connection connect() {

        final String url = "jdbc:postgresql://host:port/ibmclouddb";

        Properties props = new Properties();
        props.setProperty("user","admin");
        props.setProperty("password","mypassword123");
        props.setProperty("ssl","true");
        props.setProperty("sslmode","verify-full");
        props.setProperty("sslrootcert", "/path/to/cert");

        Connection conn = null;
        while (conn == null) {
            try {
                conn = DriverManager.getConnection(url, props);
                System.out.println("Connected to PG");
            } catch (SQLException e) {
                System.out.printf("%s\n", e);
                LOGGER.info("Not connected, retying ...");
            }
        }

        return conn;

    }

    public static void main(String[] args) {

        PGConnect icd = new PGConnect();

        try {
            Connection connection = icd.connect();
            Statement stmt = connection.createStatement();

            ResultSet rs = stmt.executeQuery("SELECT * from pg_database");
            while (rs.next()) {
                System.out.println("DB Name: " + rs.getString(1));
            }

        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }   
    }
}

下列範例使用連線字串及 Python 驅動程式 Psycopg2 中的資訊來連接至資料庫。 這只是簡單的連線範例,沒有錯誤處理或重試邏輯,可能不適用於正式作業。

import psycopg2

try:
    conn = psycopg2.connect(
      host="hostname.databases.appdomain.cloud",
      port= 31525,
      user="username",
      password="password",
      sslmode="verify-full",
      sslrootcert="/path/to/cert/ca-certificate.crt",
      database="ibmclouddb")
except:
    print("Unable to connect to database")

cur = conn.cursor()
cur.execute("SELECT datname FROM pg_database")
rows = cur.fetchall()

print("List of databases:")
for row in rows:
    print("  ",row[0])

下列範例使用連線字串及 Node 驅動程式 node-postgres 中的資訊來連接至資料庫。

const pg = require("pg");
const fs = require("fs");

let connectionString = "postgres://<username>:<password>@<host>:<port>/<database>";
let caCert = fs.readFileSync('/path/to/cert');

// set up a client with your PostgreSQL connection string and TLS options
let client = new pg.Client({
    connectionString: connectionString,
    ssl: {
    ca: caCert,
    rejectUnauthorized: true
    }
});


client.connect(function(err) {
    if (err) {
        console.log(err);
        process.exit(1);
    } else {
        // query for the names of the databases
        client.query(
            "SELECT datname FROM pg_database;",
            function(err, result) {
                if (err) {
                    console.log(err);
                }
                // return the names of the databases
                console.log(result.rows);
                client.end();
            }
        );
    }
});

若要使用 node-postgres driver,請從部署的連線字串中移除 sslmode 參數。 如果沒有,則此參數會置換 ssl: {...} 參數,以防止 CA 憑證適當地載入。

驅動程式 TLS 和服務專屬憑證支援

Databases for PostgreSQL 的所有連線都已啟用 TLS 1.2,因此您用來連接的驅動程式需要能夠支援加密。 您的部署還隨附服務專屬憑證,因此驅動程式可以在連線時驗證伺服器。

如需相關資訊,請參閱 Cloud Databases 憑證常見問題(FAQ)。

使用服務專屬憑證

  1. 從 端點 畫面或連線資訊的 Base64 欄位複製憑證資訊。
  2. 必要的話,將 Base64 字串解碼為文字。
  3. 將憑證儲存至檔案。 (您可以使用所提供的名稱或您自己的檔名)。
  4. 提供驅動程式或用戶端的憑證路徑。

CLI 端點面板
CLI 外掛程式資訊標籤

CLI 外掛程式支援服務專屬憑證

您可以使用指令 ibmcloud cdb deployment-cacert "example-deployment",使用 CLI 外掛程式來顯示部署的已解碼憑證。 它會將 base64 解碼成文字。 將指令的輸出複製並儲存至檔案,並提供檔案的驅動程式路徑。

其他驅動程式

PostgreSQL 擁有大量的語言驅動程式。 此表格涵蓋一些最常見的語言驅動程式。

PostgreSQL驅動程式
語言 驅動程式 範例
PHP pgsql 鏈結
Ruby ruby-pg 鏈結
Ruby on Rails Rails 鏈結
C# ODBC 鏈結
進行 pq 鏈結
Node node-postgres 鏈結