claude-skills/

Anthropic公式スキル・プラグインの日本語ディレクトリ

last sync 22h ago
スキルOfficialdevelopment

🐘aidp-postgresql

説明

AIDPノートブックから、AIDPの `aidataplatform` Spark フォーマットハンドラーを介して PostgreSQL の読み書きを行います。 次のような場合に使用: - ユーザーが PostgreSQL、Postgres、「psql」に言及している - ユーザーが接続先の Postgres ホスト/ポートを指定している 公式の `POSTGRESQL` コネクターサンプルを優先して使用すること。 ネイティブの Spark JDBC は、組み込みコネクターが `sslmode=require` を表現できない場合に限り、SSL 必須のフォールバックとしてのみ使用すること。

原文を表示

Read or write PostgreSQL from an AIDP notebook via the AIDP `aidataplatform` Spark format handler. Use when the user mentions PostgreSQL, Postgres, "psql", or has a Postgres host/port to connect to. Prefer the official `POSTGRESQL` connector sample; use native Spark JDBC only as an SSL-required fallback when the built-in connector cannot express sslmode=require.

ユースケース

  • PostgreSQLの読み書きを行う
  • Postgresホスト/ポート指定時
  • SSL必須接続が必要なとき

本文(日本語訳)

aidp-postgresql — AIDP aidataplatform 経由での PostgreSQL 接続

次のような場合に使用

  • ユーザーが AIDP ノートブックから PostgreSQL データベースの読み書きを行いたい場合
  • 「PostgreSQL」「Postgres」「psql」というキーワードが出てきた場合

使用しない場合


読み込み(Read)

オプション A: AIDP aidataplatform フォーマット(デフォルト)

まず公式の AIDP PostgreSQL コネクタサンプルを使用してください。

import os
from oracle_ai_data_platform_connectors.aidataplatform import (
    AIDP_FORMAT, aidataplatform_options,
)

opts = aidataplatform_options(
    type="POSTGRESQL",
    host=os.environ["PG_HOST"],
    port=int(os.environ.get("PG_PORT", "5432")),
    user=os.environ["PG_USER"],
    password=os.environ["PG_PASSWORD"],
    schema=os.environ.get("PG_SCHEMA", "public"),
    table=os.environ["PG_TABLE"],
)
df = spark.read.format(AIDP_FORMAT).options(**opts).load()
df.show()

書き込み(Write)

opts = aidataplatform_options(
    type="POSTGRESQL",
    host=os.environ["PG_HOST"],
    port=int(os.environ.get("PG_PORT", "5432")),
    user=os.environ["PG_USER"],
    password=os.environ["PG_PASSWORD"],
    schema=os.environ.get("PG_SCHEMA", "public"),
    table=os.environ["PG_TARGET_TABLE"],
    extra={"write.mode": "CREATE"},   # CREATE | APPEND | OVERWRITE
)
df.write.format(AIDP_FORMAT).options(**opts).save()

プッシュダウン SQL(Pushdown SQL)

opts = aidataplatform_options(
    type="POSTGRESQL",
    host=os.environ["PG_HOST"],
    port=int(os.environ.get("PG_PORT", "5432")),
    user=os.environ["PG_USER"],
    password=os.environ["PG_PASSWORD"],
    extra={
        "pushdown.sql": (
            f"SELECT * FROM {os.environ.get('PG_SCHEMA', 'public')}.{os.environ['PG_TABLE']} "
            "WHERE updated_at >= DATE '2024-01-01'"
        ),
    },
)
df = spark.read.format(AIDP_FORMAT).options(**opts).load()
df.show()

オプション B: SSL が必須のエンドポイント向け — ネイティブ Spark JDBC フォールバック

接続先の PostgreSQL サービスが非 TLS 接続を拒否し、かつ AIDP コネクタが必要な SSL オプションを渡せない場合にのみ使用してください。
確認されている障害モードは [PostgreSQL]connection is insecure (try using sslmode=require) です。
その場合は、URL に sslmode=require を埋め込んだ Spark ネイティブ JDBC を使用します。

クラスタに org.postgresql.Driver がプリインストールされていない可能性があるため、aidp-jdbc-custom と同様の方法でランタイム時にロードしてください。

import os, urllib.request
from py4j.java_gateway import java_import

JAR_PATH = "/tmp/postgresql-42.7.4.jar"
if not os.path.exists(JAR_PATH):
    urllib.request.urlretrieve(
        "https://repo1.maven.org/maven2/org/postgresql/postgresql/42.7.4/postgresql-42.7.4.jar",
        JAR_PATH,
    )

# ドライバ JVM にドライバを登録
gw = spark._sc._gateway
url = spark._jvm.java.io.File(JAR_PATH).toURI().toURL()
arr = gw.new_array(spark._jvm.java.net.URL, 1); arr[0] = url
ucl = spark._jvm.java.net.URLClassLoader(arr, spark._jvm.java.lang.ClassLoader.getSystemClassLoader())
spark._jvm.java.lang.Thread.currentThread().setContextClassLoader(ucl)
DriverCls = spark._jvm.java.lang.Class.forName("org.postgresql.Driver", True, ucl)
spark._jvm.java.sql.DriverManager.registerDriver(DriverCls.newInstance())
spark._jsc.addJar(JAR_PATH)  # エグゼキュータに配布

# 読み込み — sslmode=require を URL に埋め込んでいることに注意
JDBC_URL = (
    f"jdbc:postgresql://{os.environ['PG_HOST']}:{os.environ.get('PG_PORT','5432')}"
    f"/{os.environ['PG_DB']}?sslmode=require"
)
df = (spark.read.format("jdbc")
      .option("url", JDBC_URL)
      .option("driver", "org.postgresql.Driver")
      .option("user", os.environ["PG_USER"])
      .option("password", os.environ["PG_PASSWORD"])
      .option("dbtable", f"{os.environ.get('PG_SCHEMA','public')}.{os.environ['PG_TABLE']}")
      .load())
df.show(5)

注意事項(Gotchas)

  • まず aidataplatform を使用すること。
    これが公式のサンプルパスであり、専用のバンドルドライバが付属しています。

  • SSL フォールバック
    AIDP の POSTGRESQL ハンドラが SSL オプションを渡せず、サーバが sslmode=require を要求する場合は、オプション B(ネイティブ Spark JDBC)を使用してください。
    2026-04-27 に Neon サーバレス 17.8 で動作確認済み。

  • ネイティブ Spark JDBC 用のバンドルドライバは存在しない
    オプション B を使用する場合は、PostgreSQL の JAR をランタイム時にロードし、URLClassLoader + DriverManager.registerDriver + spark._jsc.addJar で登録してください。

  • ネットワーク到達性
    PostgreSQL が AIDP クラスタの NAT 出口 IP から到達可能である必要があります。
    パブリックインターネット上のエンドポイント(Neon、Supabase、RDS パブリック)はクラスタの NAT 経路経由で接続可能です。
    ユーザー管理の VCN 内にセルフホストされた PostgreSQL は、明示的な VCN ピアリングなしではクラスタの Pod CIDR からルートが存在しないため、通常は接続できません
    疎通確認には Python の socket を使用してください: socket.create_connection((host, 5432), timeout=8)

  • schema について
    schema は Postgres の論理スキーマ(例: public)であり、データベース名ではありません。
    データベース名は別途 PG_DB 環境変数として JDBC URL に渡します。

  • 書き込みモード
    CREATE(既存の場合は失敗)、APPENDOVERWRITE の3種類。デフォルトは CREATE


参考情報

原文(English)を表示

aidp-postgresql — PostgreSQL via AIDP aidataplatform

When to use

  • User wants to read or write a PostgreSQL database from an AIDP notebook.
  • Mentioned: "PostgreSQL", "Postgres", "psql".

When NOT to use

Read

Option A: AIDP aidataplatform format (default)

Use the official AIDP PostgreSQL connector sample first.

import os
from oracle_ai_data_platform_connectors.aidataplatform import (
    AIDP_FORMAT, aidataplatform_options,
)

opts = aidataplatform_options(
    type="POSTGRESQL",
    host=os.environ["PG_HOST"],
    port=int(os.environ.get("PG_PORT", "5432")),
    user=os.environ["PG_USER"],
    password=os.environ["PG_PASSWORD"],
    schema=os.environ.get("PG_SCHEMA", "public"),
    table=os.environ["PG_TABLE"],
)
df = spark.read.format(AIDP_FORMAT).options(**opts).load()
df.show()

Write

opts = aidataplatform_options(
    type="POSTGRESQL",
    host=os.environ["PG_HOST"],
    port=int(os.environ.get("PG_PORT", "5432")),
    user=os.environ["PG_USER"],
    password=os.environ["PG_PASSWORD"],
    schema=os.environ.get("PG_SCHEMA", "public"),
    table=os.environ["PG_TARGET_TABLE"],
    extra={"write.mode": "CREATE"},   # CREATE | APPEND | OVERWRITE
)
df.write.format(AIDP_FORMAT).options(**opts).save()

Pushdown SQL

opts = aidataplatform_options(
    type="POSTGRESQL",
    host=os.environ["PG_HOST"],
    port=int(os.environ.get("PG_PORT", "5432")),
    user=os.environ["PG_USER"],
    password=os.environ["PG_PASSWORD"],
    extra={
        "pushdown.sql": (
            f"SELECT * FROM {os.environ.get('PG_SCHEMA', 'public')}.{os.environ['PG_TABLE']} "
            "WHERE updated_at >= DATE '2024-01-01'"
        ),
    },
)
df = spark.read.format(AIDP_FORMAT).options(**opts).load()
df.show()

Option B: Native Spark JDBC fallback for SSL-required endpoints

Use this only when the target PostgreSQL service rejects non-TLS connections and the AIDP connector cannot pass the required SSL option. The observed failure mode is [PostgreSQL]connection is insecure (try using sslmode=require). In that case, use Spark native JDBC with URL-embedded sslmode=require.

The cluster may not have org.postgresql.Driver pre-installed, so runtime-load it the same way aidp-jdbc-custom does.

import os, urllib.request
from py4j.java_gateway import java_import

JAR_PATH = "/tmp/postgresql-42.7.4.jar"
if not os.path.exists(JAR_PATH):
    urllib.request.urlretrieve(
        "https://repo1.maven.org/maven2/org/postgresql/postgresql/42.7.4/postgresql-42.7.4.jar",
        JAR_PATH,
    )

# Register driver on driver JVM
gw = spark._sc._gateway
url = spark._jvm.java.io.File(JAR_PATH).toURI().toURL()
arr = gw.new_array(spark._jvm.java.net.URL, 1); arr[0] = url
ucl = spark._jvm.java.net.URLClassLoader(arr, spark._jvm.java.lang.ClassLoader.getSystemClassLoader())
spark._jvm.java.lang.Thread.currentThread().setContextClassLoader(ucl)
DriverCls = spark._jvm.java.lang.Class.forName("org.postgresql.Driver", True, ucl)
spark._jvm.java.sql.DriverManager.registerDriver(DriverCls.newInstance())
spark._jsc.addJar(JAR_PATH)  # distribute to executors

# Now read — note sslmode=require URL-embedded
JDBC_URL = (
    f"jdbc:postgresql://{os.environ['PG_HOST']}:{os.environ.get('PG_PORT','5432')}"
    f"/{os.environ['PG_DB']}?sslmode=require"
)
df = (spark.read.format("jdbc")
      .option("url", JDBC_URL)
      .option("driver", "org.postgresql.Driver")
      .option("user", os.environ["PG_USER"])
      .option("password", os.environ["PG_PASSWORD"])
      .option("dbtable", f"{os.environ.get('PG_SCHEMA','public')}.{os.environ['PG_TABLE']}")
      .load())
df.show(5)

Gotchas

  • Use aidataplatform first. It is the official sample path and has its own bundled driver.
  • SSL fallback — if the AIDP POSTGRESQL handler cannot pass SSL options and the server requires sslmode=require, use Option B with native Spark JDBC. Verified live 2026-04-27 against Neon serverless 17.8.
  • No bundled driver for native Spark JDBC — if you use Option B, runtime-load the PostgreSQL jar and register it via URLClassLoader + DriverManager.registerDriver + spark._jsc.addJar.
  • Network reachability — Postgres must be reachable from the AIDP cluster's NAT egress IP. Public-internet endpoints (Neon, Supabase, RDS public) work via the cluster's NAT path. Self-hosted Postgres in user-managed VCNs typically does NOT work — the cluster's pod CIDR has no route to user VCNs without explicit VCN peering. Smoke-test with a Python socket: socket.create_connection((host, 5432), timeout=8).
  • schema is the Postgres logical schema (e.g. public), not the database name. The database name is a separate PG_DB env var that goes into the JDBC URL.
  • Write modesCREATE (fail if exists), APPEND, OVERWRITE. Default is CREATE.

References

原文・著作権は Anthropic および各プラグイン作者に帰属します。日本語訳は Claude API による自動翻訳です。