You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否用DuckDB连接OCI存储桶并读取文件?连接报错求助

DuckDB连接OCI存储桶读取文件的解决方案

DuckDB完全支持通过S3兼容模式连接OCI对象存储,因为OCI对象存储提供S3兼容API,配合httpfs扩展即可实现文件读取。你的代码存在几处语法和配置问题,导致连接失败,以下是修正方案:

代码错误分析

  • s3_path变量赋值未加引号,不符合Python字符串语法要求
  • SQL查询语句未闭合:read_parquet('{s3_path}"存在单引号、双引号未配对的语法错误
  • 直接使用HTTP URL适配性差,推荐用DuckDB原生支持的s3://bucket-name/file-path格式

修正后的完整代码

import duckdb

# 替换为你的OCI实际信息
ENDPOINT = "compat.objectstorage.<your_region>.oraclecloud.com"
region_name = "<your_region>"
ACCESS_KEY = "<your_oci_access_key>"
SECRET_KEY = "<your_oci_secret_key>"
bucket_name = "<your_bucket_name>"
file_path = "<your_target_file_path>"

cursor = duckdb.connect()
cursor.execute("INSTALL httpfs;")
cursor.execute("LOAD httpfs;")

# 配置S3兼容参数
cursor.execute(f"SET s3_endpoint='{ENDPOINT}'")
cursor.execute(f"SET s3_region='{region_name}'")
cursor.execute(f"SET s3_access_key_id='{ACCESS_KEY}'")
cursor.execute(f"SET s3_secret_access_key='{SECRET_KEY}'")
cursor.execute("SET s3_use_ssl=true;")
cursor.execute("SET s3_url_style='path';")  # OCI对象存储适配路径风格

# 执行查询并获取结果
query = f"SELECT count(*) FROM read_parquet('s3://{bucket_name}/{file_path}');"
result = cursor.execute(query).fetchone()
print(f"文件记录数:{result[0]}")

关键注意事项

  • 确保OCI用户已配置对象存储读取权限(如ALLOW any-user to read objects in tenancy where target.bucket.name='<your_bucket_name>'类策略)
  • 凭证需使用OCI的客户密钥对:ACCESS_KEY是密钥的"访问密钥",SECRET_KEY是对应的"秘密值",并非用户登录密码
  • 端点地址无需包含bucket namespace,使用s3://格式时DuckDB会自动拼接正确路径

内容的提问来源于stack exchange,提问作者Danial

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 14:42:51