如何避免Pandas read_sql_query返回结果的数据截断问题
解决PostgreSQL返回长CREATE TABLE语句被Pandas截断的问题
我之前也碰到过完全一样的情况——用Pandas读取PostgreSQL返回的长建表语句时,结果总是被截断,排查后发现是几个环节的问题,下面给你分步解决的方案:
第一步:先确保数据库端不截断字符串
你的SQL语句里,最终的cast操作一定要把结果转成TEXT类型,而不是有长度限制的VARCHAR。如果用了VARCHAR(512)之类的类型,PostgreSQL会直接把超过长度的部分截断,这时候不管后续怎么处理都拿不到完整内容。修正后的SQL应该是这样的(重点看最后cast的部分):
SELECT cast ('CREATE TABLE dbo.table1 (' || string_agg(pa.attname || ' ' || pg_catalog.format_type(pa.atttypid, pa.atttypmod) || coalesce(' DEFAULT ' || (select pg_catalog.pg_get_expr(d.adbin, d.adrelid) from pg_catalog.pg_attrdef d where d.adrelid = pa.attrelid and d.adnum = pa.attnum and pa.atthasdef), '') || ' ' || case pa.attnotnull when true then 'NOT NULL' else 'NULL' end, ',') || ')' as text) as column_from_script from pg_catalog.pg_attribute pa join pg_catalog.pg_class pc on pc.oid = pa.attrelid and pc.relname = 'tabl1_source' join pg_catalog.pg_namespace pn on pn.oid = pc.relnamespace and pn.nspname = 'dbo' where pa.attnum > 0 and not pa.attisdropped group by pn.nspname, pc.relname, pa.attrelid;
第二步:绕过Pandas,直接用psycopg2游标获取完整结果
Pandas在读取数据时,有时候会因为类型推断或者内存优化的原因,对长字符串做截断处理。最稳妥的方式是直接用psycopg2的游标来获取结果,这样能拿到数据库返回的原始完整字符串:
import psycopg2 as pg # 建立连接 conn = pg.connect( host=pgparams['url'], dbname=pgparams['db'], user=pgparams['usr'], password=pgparams['pwd'] ) # 执行SQL cur = conn.cursor() cur.execute(createTable_sql) # 这里用上面修正后的SQL result = cur.fetchone() full_create_script = result[0] if result else None # 直接拿到完整字符串 # 关闭资源 cur.close() conn.close() # 验证结果 print(full_create_script)
如果一定要用Pandas的解决办法
如果你需要用Pandas处理结果,可以调整两个关键设置,确保Pandas不截断字符串:
- 强制指定列类型为
object,避免Pandas自动推断时的截断:
import pandas as pd # 先设置Pandas显示完整内容(可选,解决print时的显示截断) pd.set_option('display.max_colwidth', None) # 读取时指定列的类型为object df_create_table_script = pd.read_sql_query( createTable_sql, con=conn, dtype={'column_from_script': object} ) # 获取完整字符串 full_script = df_create_table_script['column_from_script'].iloc[0]
这样处理后,不管是数据库端还是Pandas端,都不会截断你的长建表语句了。
内容的提问来源于stack exchange,提问作者BogdanM
相关产品推荐
相关产品推荐

