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

將外部應用程式連接至 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 鏈結