PG* 密鑰、所需套件與查詢程式碼。
本指南建立在兩個基礎設定頁面之上:
前置需求
本指南專門針對 PostgreSQL(本機、Neon、RDS 或任何相容 Postgres 的資料庫)。唯讀角色的 SQL、
psycopg2 驅動程式與連線 URL 格式都是 Postgres 專屬 — 其他資料庫引擎(MySQL、SQL Server、BigQuery 等)使用不同的角色、驅動程式與語法。- 一個 PostgreSQL 資料庫,以及可建立角色的超級使用者或擁有者帳號。
- 執行 SQL 的方式(
psql、pgAdmin或供應商的 SQL 編輯器)。 - DataGen 中一個會執行查詢程式碼的 Agent 或應用。
託管資料庫(Neon、RDS、Supabase)本來就能透過 TLS 連線,不需要通道 — 任何具有對外網路的沙盒都能直接連線。只有要對外開放你自己電腦上的資料庫時,才需要通道。
1. 建立唯讀使用者
Agent 以只能SELECT 的角色連線 — 永遠不能寫入、刪除或修改結構。這能限制影響範圍:憑證外洩時最多只會暴露資料,絕不會變更或破壞任何東西。
- SQL(任何 Postgres)
- pgAdmin
以超級使用者或資料庫擁有者身分,連到 執行腳本:
<DB> 後執行:create_readonly_role.sql
2. 把連線資訊存成 PG* 密鑰
把連線資訊存成個別的 libpqPG* 變數。Postgres 驅動程式會自動讀取它們,因此你的程式碼不需要組合或解析 URL,含特殊字元的密碼也不需要編碼。
在 Agent 或應用綁定的 連線保險庫 中,以 新增憑證 -> 密鑰 逐一新增下列各列,目標 設為變數名稱,類型 依範圍設定:
主機、埠號、資料庫與 sslmode 對每個人都一樣,因此由管理員以工作區共用設定一次。使用者與密碼屬於每位成員,因此設為個人:每位成員在該列點選 連接 並輸入自己的值。
請完全使用 libpq 的名稱。DataGen 會把目標轉為大寫,所以
pghost 也會變成 PGHOST;但像 PSQL_PASSWORD 這種不同的名稱,libpq 永遠不會讀取。替代方案:單一 DATABASE_URL 密鑰
替代方案:單一 DATABASE_URL 密鑰
想只用一個值?新增一個 密鑰,目標 設為 託管資料庫會加上 TLS 參數,例如 Neon:以
DATABASE_URL,值為由相同元素組成的完整 URL:os.environ["DATABASE_URL"] 讀取。若 URL 內含個人憑證,類型 設為 個人,否則設為 與工作區共用。3. 預先建置查詢套件
透過 沙箱環境 為沙盒提供pandas、sqlalchemy 與 psycopg2-binary。內建的 Data Engineering 範本已包含這些套件(另含 duckdb、polars 與 pyarrow)。以它建立環境,等待 就緒 標籤出現後,再於 Agent 或應用上選取它。
Alpine / musl 基礎映像檔:
psycopg2-binary 只提供 glibc wheel。在 musl 映像檔上,請改用 psycopg[binary](psycopg 3 提供 musl wheel),並以 postgresql+psycopg:// URL 連線,而非 postgresql+psycopg2://。4. 查詢
快速端到端檢查
疑難排解
執行失敗並顯示「Vault not ready」
執行失敗並顯示「Vault not ready」
執行身分的成員尚未填入自己的個人
PGUSER / PGPASSWORD。請他在連線保險庫中對每一列點選 連接。請見 連線保險庫常見問題。ModuleNotFoundError: sqlalchemy / psycopg2
ModuleNotFoundError: sqlalchemy / psycopg2
Agent 或應用沒有綁定含查詢套件的環境,或該環境仍在建置中。請到 沙箱環境 檢查標籤。
為什麼要 pool_pre_ping=True
為什麼要 pool_pre_ping=True
連線池中的連線可能在兩次查詢之間失效 — 伺服器的閒置逾時把它斷開、資料庫重新啟動,或無伺服器後端(Neon)進入暫停。
pool_pre_ping 會在重複使用連線前送出一個成本很低的 SELECT 1,把失效連線造成的錯誤變成無感的重新連線。對任何長時間執行或會間歇閒置的沙盒來說,都是划算的保險。第一次查詢很慢(1-3 秒)
第一次查詢很慢(1-3 秒)
Neon 資料庫閒置一段時間後的第一次連線,會在運算資源喚醒時觸發冷啟動。請設定寬鬆的
connect_timeout — 這不是網路故障,下一次查詢就會很快。出現資料表「does not exist」錯誤
出現資料表「does not exist」錯誤
在原始 SQL 中,PascalCase 的資料表名稱要加引號:
'SELECT * FROM "Workspace"'。沒有引號時,Postgres 會把識別字轉為小寫,並回報資料表不存在。連線逾時
連線逾時
沙盒連不到該主機。私有 IP 只能從同一網路中的沙盒連線;從雲端沙盒連線時,請把資料庫加入允許清單,或使用通道或 peering。
安全檢查清單
- 沙盒以唯讀角色連線,絕不使用擁有者角色。
- 連線資訊存放在連線保險庫密鑰(
PG*或DATABASE_URL)中,絕不放在程式碼或 git 裡。 - 已設定
ALTER DEFAULT PRIVILEGES,讓之後建立的資料表也能讀取。 - (Postgres 14 及更早版本)已從
PUBLIC撤銷CREATE,讓此角色無法寫入。 - 雲端資料庫使用
sslmode=require(支援時加上channel_binding=require)。 - 只要密碼曾被貼到聊天、日誌或工單中,就輪替它。
下一步
檔案
上傳 Agent 可讀取的文件與試算表。
在 Agent 中使用資料
把已發布的分析資料掛載到 Agent 與應用,取代原始 SQL。