使用Pandas读取Teradata表,如何获取精确字段定义(如varchar(36))
获取Teradata表精确字段定义(替代Pandas的object类型显示)
当然可以!Pandas默认会把Teradata的字符类型(比如varchar)映射成Python的object类型,这是因为Pandas的类型系统和数据库原生类型不完全匹配。但我们可以通过两种实用方法拿到数据库端的精确字段定义:
方法1:直接查询Teradata的数据字典
Teradata自带系统表dbc.columns,里面存储了所有表的字段元数据,我们可以用SQL查询来获取原始的字段类型:
import pandas as pd from teradatasql import connect # 建立Teradata连接 conn = connect(host='你的Teradata主机地址', user='用户名', password='密码') # 指定目标表和所属数据库 target_db = '你的数据库名' target_table = '你的表名' # 查询数据字典的SQL语句 schema_query = f""" SELECT ColumnName, ColumnType FROM dbc.columns WHERE DatabaseName = '{target_db}' AND TableName = '{target_table}' ORDER BY ColumnId; # 按字段顺序排序 """ # 读取字段定义到DataFrame schema_df = pd.read_sql(schema_query, conn) print(schema_df) # 记得关闭连接 conn.close()
执行后你会得到类似这样的结果,直接显示原始的字段类型(比如varchar(36)、float):
ColumnName ColumnType 0 ID FLOAT 1 Name VARCHAR(36) 2 Address VARCHAR(100)
方法2:通过游标元数据获取字段信息
如果你已经在读取表数据,也可以通过数据库游标描述(cursor.description)拿到字段的原始类型,不需要单独查数据字典:
import pandas as pd from teradatasql import connect conn = connect(host='你的Teradata主机地址', user='用户名', password='密码') cursor = conn.cursor() # 执行一个空查询(只获取元数据,不加载数据) cursor.execute(f"SELECT * FROM {target_db}.{target_table} LIMIT 0;") # 提取字段元数据 field_details = [] for col_desc in cursor.description: field_details.append({ '字段名': col_desc[0], '原始类型': col_desc[1] # 这里就是Teradata的原生类型字符串 }) # 转换成DataFrame查看 field_df = pd.DataFrame(field_details) print(field_df) # 之后正常加载数据到DataFrame df = pd.read_sql(f"SELECT * FROM {target_db}.{target_table}", conn) conn.close()
小提醒
Pandas的df.info()显示的是Python/Pandas层面的数据类型,和数据库的原生类型是两回事。要拿到数据库端的精确定义,必须从Teradata的元数据(数据字典或游标描述)中获取,上面两种方法都能完美解决你的需求~
内容的提问来源于stack exchange,提问作者JD2775
相关产品推荐
相关产品推荐

