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

如何通过Polars自动将PostgreSQL二进制数据转为文本?

解决方案

方法1:动态生成带类型转换的SQL查询

直接从PostgreSQL系统表获取目标表的字段信息,自动对uuid和jsonb类型字段添加::text转换,其他字段保持原样,无需手动罗列所有字段。

示例代码:

import polars as pl
import psycopg2

def generate_auto_convert_query(table_name, db_uri):
    # 连接数据库查询字段元信息
    conn = psycopg2.connect(db_uri)
    cursor = conn.cursor()
    
    cursor.execute("""
        SELECT column_name, data_type
        FROM information_schema.columns
        WHERE table_name = %s
        ORDER BY ordinal_position
    """, (table_name,))
    
    columns = cursor.fetchall()
    conn.close()
    
    # 拼接转换后的字段列表
    select_clause = []
    for col_name, data_type in columns:
        if data_type in ('uuid', 'jsonb'):
            select_clause.append(f"{col_name}::text AS {col_name}")
        else:
            select_clause.append(col_name)
    
    return f"SELECT {', '.join(select_clause)} FROM {table_name};"

# 使用示例
table_name = "your_table"
database_uri = "postgresql://user:pass@host:port/db"
auto_query = generate_auto_convert_query(table_name, database_uri)

df = pl.read_database_uri(
    query=auto_query,
    uri=database_uri,
    engine="adbc"
)

方法2:Polars读取后批量转换字段

先执行SELECT *读取全量数据,再在Polars中识别需要转换的字段,批量转为字符串。

方案A:按字段名指定转换

如果明确知道需要转换的字段名称,直接针对性转换:

df = pl.read_database_uri(
    query="SELECT * FROM your_table;",
    uri=database_uri,
    engine="adbc"
).with_columns(
    pl.col("id").cast(pl.Utf8),
    pl.col("data").cast(pl.Utf8)
)

方案B:自动识别二进制类型字段

如果不确定字段名,但二进制类型对应需要转换的字段,可遍历类型匹配的列:

df = pl.read_database_uri(
    query="SELECT * FROM your_table;",
    uri=database_uri,
    engine="adbc"
)

# 批量转换所有Binary类型的列为字符串
binary_cols = [col for col, dtype in df.schema.items() if dtype == pl.Binary]
df = df.with_columns(pl.col(binary_cols).cast(pl.Utf8))

方法3:配置ADBC驱动的类型映射(推荐)

ADBC PostgreSQL驱动支持通过配置参数调整类型映射,直接将uuid和jsonb类型映射为字符串,无需修改SQL或后续转换。

示例代码:

import polars as pl
from adbc_driver_postgresql import dbapi

# 创建带类型映射配置的连接
with dbapi.connect(database_uri, options={
    "adbc.postgresql.type_override.uuid": "utf8",
    "adbc.postgresql.type_override.jsonb": "utf8"
}) as conn:
    df = pl.read_database(
        query="SELECT * FROM your_table;",
        connection=conn,
        engine="adbc"
    )

注:不同版本的ADBC驱动参数名称可能略有差异,需以对应版本驱动文档为准。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 11:21:23