本文介绍如何直接利用 psycopg2 游标 cursor.description 获取的列名,配合查询结果行数据,一步构建 Polars DataFrame,避免先转 Pandas 再转换的低效操作。
本文介绍如何直接利用 psycopg2 游标 `cursor.description` 获取的列名,配合查询结果行数据,一步构建 polars dataframe,避免先转 pandas 再转换的低效操作。
Polars 提供了原生、高效的方式从二维数据(如 cur.fetchall() 返回的列表嵌套元组/列表)和列名列表构造 DataFrame,关键在于正确使用 schema 参数——它不仅支持列名列表,还能自动推断每列的数据类型,无需手动指定。
以下为完整实践示例,延续你已有的 psycopg2 连接逻辑:
import polars as pl
import psycopg2
# 建立数据库连接(保持原有配置)
rds_conn = psycopg2.connect(
host=config.RDS_HOST_NAME,
database=config.RDS_DB_NAME,
user=config.RDS_DB_USER,
password=config.RDS_DB_PASSWORD,
port=config.RDS_PORT
)
cur = rds_conn.cursor()
cur.execute(sql_query)
# 提取列名:从 cursor.description[0] 获取每个字段的名称
names = [x[0] for x in cur.description]
rows = cur.fetchall()
cur.close()
rds_conn.close() # 推荐及时关闭连接
# ✅ 正确方式:将列名列表直接传入 schema 参数
df = pl.DataFrame(rows, schema=names)⚠️ 注意事项:
- pl.DataFrame(rows, schema=names) 中,rows 应为行优先结构(即 list[list] 或 list[tuple]),每子项代表一行;Polars 会按列名顺序逐列映射并自动推断 dtype(如 int, str, bool, float 等)。
- 不要使用 with_columns() 或 rename() 等后置方法——它们适用于已有 DataFrame 的列操作,无法替代初始化时的 schema 定义。
- 若需显式控制数据类型(例如强制某列为 pl.Utf8 或 pl.Int32),可传入 schema 字典:schema={"col_a": pl.Utf8, "col_b": pl.Int32}。
- 对于超大数据集,建议改用 pl.read_database()(Polars ≥ 0.20.0)直接流式读取,性能更优且自动处理 schema:
df = pl.read_database(sql_query, connection=rds_conn)
综上,只需将 pd.DataFrame(rows, columns=names) 替换为 pl.DataFrame(rows, schema=names),即可零成本迁移至 Polars,享受其内存效率与并行计算优势。

















