Skip to main content
已發布的 分析資料 是提供資料給 Agent 的建議方式。當程式碼需要直接查詢資料庫時 — 例如臨時 SQL、尚未建模的資料表、長時間執行的應用 — 請從沙盒以唯讀角色連線。本指南說明角色、承載連線資訊的 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 的角色連線 — 永遠不能寫入、刪除或修改結構。這能限制影響範圍:憑證外洩時最多只會暴露資料,絕不會變更或破壞任何東西。
以超級使用者或資料庫擁有者身分,連到 <DB> 後執行:
create_readonly_role.sql
最後一行為選用。GRANT SELECT ON ALL TABLES 只涵蓋目前已存在的資料表;ALTER DEFAULT PRIVILEGES 會把讀取權限延伸到之後建立的資料表。請以擁有這些資料表的角色執行此腳本。
執行腳本:
確認它真的是唯讀:

2. 把連線資訊存成 PG* 密鑰

把連線資訊存成個別的 libpq PG* 變數。Postgres 驅動程式會自動讀取它們,因此你的程式碼不需要組合或解析 URL,含特殊字元的密碼也不需要編碼。 在 Agent 或應用綁定的 連線保險庫 中,以 新增憑證 -> 密鑰 逐一新增下列各列,目標 設為變數名稱,類型 依範圍設定: 主機、埠號、資料庫與 sslmode 對每個人都一樣,因此由管理員以工作區共用設定一次。使用者與密碼屬於每位成員,因此設為個人:每位成員在該列點選 連接 並輸入自己的值。
請完全使用 libpq 的名稱。DataGen 會把目標轉為大寫,所以 pghost 也會變成 PGHOST;但像 PSQL_PASSWORD 這種不同的名稱,libpq 永遠不會讀取。
主機會隨程式碼執行的位置而改變:
Neon 的連線資訊位於 Console -> 你的專案 -> Connection Details。Agent 與沙盒工作負載請使用 pooled(-pooler)主機。
可連線性。 像 10.10.0.15 這樣的私有位址,只有在同一個網路中的沙盒才能解析。地端版 DataGen 在你的網路內執行沙盒,因此能直接連到資料庫 — 不需要通道。從雲端沙盒連線時,資料庫必須透過防火牆允許清單、VPC peering 或通道才能連到。
想只用一個值?新增一個 密鑰,目標 設為 DATABASE_URL,值為由相同元素組成的完整 URL:
託管資料庫會加上 TLS 參數,例如 Neon:
以 os.environ["DATABASE_URL"] 讀取。若 URL 內含個人憑證,類型 設為 個人,否則設為 與工作區共用。
若密碼含有 URL 特殊字元(@ : / ? # %),請進行 URL 編碼 — @ 會變成 %40。PG* 做法完全不會遇到這個問題,因為 libpq 會照字面讀取每個值。

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. 查詢

快速端到端檢查


疑難排解

執行身分的成員尚未填入自己的個人 PGUSER / PGPASSWORD。請他在連線保險庫中對每一列點選 連接。請見 連線保險庫常見問題。
Agent 或應用沒有綁定含查詢套件的環境,或該環境仍在建置中。請到 沙箱環境 檢查標籤。
連線池中的連線可能在兩次查詢之間失效 — 伺服器的閒置逾時把它斷開、資料庫重新啟動,或無伺服器後端(Neon)進入暫停。pool_pre_ping 會在重複使用連線前送出一個成本很低的 SELECT 1,把失效連線造成的錯誤變成無感的重新連線。對任何長時間執行或會間歇閒置的沙盒來說,都是划算的保險。
Neon 資料庫閒置一段時間後的第一次連線,會在運算資源喚醒時觸發冷啟動。請設定寬鬆的 connect_timeout — 這不是網路故障,下一次查詢就會很快。
在原始 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。