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

使用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或更高,这是最直接的解决方式:

  1. 安装依赖:
pip install polars pyodbc
  1. 编写连接与读取代码:
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)
  1. 验证区分效果:
# 筛选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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 19:45:14