能否用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
相关产品推荐
相关产品推荐

