使用Pandas read_sql_query()指定UNIQUEIDENTIFIER dtype触发TypeError
问题原因
Pandas的read_sql_query()方法的dtype参数只接受NumPy数据类型(如np.object_)或Pandas自身的扩展类型(如pd.StringDtype()),你传入的UNIQUEIDENTIFIER是SQLAlchemy针对SQL Server定义的方言数据类型,不属于Pandas能识别的 dtype 范畴,所以触发了类型错误。
解决方案
方案1:依赖驱动自动映射(推荐)
pyodbc驱动会自动把SQL Server的UNIQUEIDENTIFIER类型映射为Python的uuid.UUID对象,Pandas会将这类列识别为object dtype,直接使用即可:
df_ifg_appt = pd.read_sql_query( ''' select p.id, p.name, p.start_date, p.end_date from core.person p ''', con=connection ) # 如需将UUID转为字符串格式,可后续处理: df_ifg_appt['id_str'] = df_ifg_appt['id'].astype(str)
方案2:显式指定Pandas支持的dtype
根据存储需求选择对应的Pandas兼容类型:
- 若要保留UUID对象,指定
dtype={'id': object} - 若要直接存储字符串格式的UUID,指定
dtype={'id': pd.StringDtype()}
示例代码:
df_ifg_appt = pd.read_sql_query( ''' select p.id, p.name, p.start_date, p.end_date from core.person p ''', con=connection, dtype={ 'id': pd.StringDtype() } )
方案3:查询时直接转换为字符串
在SQL语句中把UNIQUEIDENTIFIER转为字符串,Pandas会自动识别为字符串列,无需额外指定dtype:
select CAST(p.id AS VARCHAR(36)) AS id, p.name, p.start_date, p.end_date from core.person p
内容的提问来源于stack exchange,提问作者philipnye
相关产品推荐
相关产品推荐

