使用Polars read_database读取SQL Server时如何区分NULL与空字符串?
解决Polars读取SQL Server时区分NULL与空字符串的问题
核心原因
Polars本身支持字符串列同时存在空字符串('')和null,问题通常出在数据库驱动的配置或返回值处理上,而非Polars的read_database函数本身。SQL Server的NULL会被驱动映射为Python的None(Polars转为null),空字符串则映射为Python的''(Polars保留为''),只要驱动正确返回这两种值,Polars就能区分。
解决方案一:使用正确的驱动与连接配置
推荐使用pyodbc驱动连接SQL Server,确保驱动版本为ODBC Driver 17或更高,这是最直接的解决方式:
- 安装依赖:
pip install polars pyodbc
- 编写连接与读取代码:
import polars as pl import pyodbc # 配置SQL Server连接字符串 conn_str = ( "DRIVER={ODBC Driver 17 for SQL Server};" "SERVER=你的服务器地址;" "DATABASE=你的数据库名;" "UID=你的用户名;" "PWD=你的密码;" ) # 建立连接并读取数据 with pyodbc.connect(conn_str) as conn: df = pl.read_database("SELECT * FROM 你的表名", connection=conn)
- 验证区分效果:
# 筛选SQL NULL对应的Polars null值 null_rows = df.filter(pl.col("目标列").is_null()) # 筛选空字符串值 empty_rows = df.filter(pl.col("目标列") == "")
解决方案二:SQL层显式标记(备选)
如果驱动配置无法调整,可在SQL查询中显式区分NULL与空字符串,比自定义标记更清晰:
SELECT 列1, -- 对可能存在NULL/空字符串的列做标记 CASE WHEN 列2 IS NULL THEN '::SQL_NULL::' WHEN 列2 = '' THEN '::EMPTY_STRING::' ELSE 列2 END AS 列2, 列3 FROM 你的表名
读取后可通过字符串匹配还原或直接用于对比逻辑。
注意事项
- 确保Polars版本在0.18.0以上,旧版本可能存在字符串类型处理的bug。
- 避免使用
TEXT等过时的SQL Server数据类型,改用VARCHAR/NVARCHAR,这类类型对空字符串和NULL的返回更稳定。
内容的提问来源于stack exchange,提问作者Josh L
相关产品推荐
相关产品推荐

