首页 > 解决方案 > 如何避免返回集的 read_sql_query 数据截断

问题描述

我正在执行一个 sql 命令,该命令返回我的数据库 PostgreSQL 提供的创建表语句。为了执行我使用的 sql 命令:

import io  
import json  
import pandas as pd
import pandas.io.sql as psql
import psycopg2 as pg
import boto3
from datetime import datetime 

conn = pg.connect(
    host=pgparams['url'],
    dbname=pgparams['db'],
    user=pgparams['usr'],
    password=pgparams['pwd'])  
createTable_sql = "postgresql select which returns the create table statement"   

df_create_table_script = pd.read_sql_query(createTable_sql ,con=connection) 

我的范围创建一个表。在通过 Pandas / Python 执行“pd.read_sql_query”命令后,PostgreSql 返回表创建脚本。

如果我在 pgsql 解释器(例如 pgadmin 等)中执行“createTable_sql”,它工作正常,因此我只有一列具有预期的创建表语句,或者只是一个长度为 512 个字符的普通字符串.

“createTable_sql”变量的内容是:

    createTable_sql= "SELECT cast ('CREATE TABLE dbo.table1 (" ...  
    createTable_sql= createTable_sql + "|| 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, ',')"
    createTable_sql= createTable_sql + " 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.relnamespaceand pn.nspname = 'dbo' where pa.attnum > 0  and not pa.attisdropped group by    pn.nspname,     pc.relname,     pa.attrelid;"

执行此 sql 命令时的结果应该是:

 CREATE TABLE dbo.table1 (col1 datatype, col2, datatype, ....etc) -total number of charters from script is 512.

我的问题是 Pandas read_sql_query 或 read_sql 对返回的数据集有限制(或者至少是我认为的)。
我期望返回或读取的数据集有 512 个字符,但 read_sql 方法正在截断它。

当我尝试访问 Postgresql(数据库引擎)返回的结果时,我得到的结果是:

' CREATE TABLE dbo.tabl1 (col1...'
 

因此,我只有在前几个字符之后被截断的东西,而不是全文(代表表创建脚本)。

最初我假设它仅在我使用 print() 函数获取返回结果时被截断,但值本身也被截断。

我什至尝试了另一种方法,例如:

conn = pg.connect(
                host=pgparams['url'],
                dbname=pgparams['db'],
                user=pgparams['usr'],
                password=pgparams['pwd'])
sql =createTable_sql 
copy_func_csv = "COPY ({sql_cmd}) TO STDOUT WITH CSV {head}".format(sql_cmd=sql, head="HEADER")  
cur = conn.cursor()
store = io.StringIO()
cur.copy_expert(copy_func_csv , store)
store.seek(0)
df_new = pd.read_csv(store, engine='python', true_values=[True, 't'],false_values =[False, 'f'])
table_script = df_new .column_from_script.to_string(header=False,index=False)

但是 table_script 内容仍然被截断,看起来像:

' 创建表 dbo.tabl1 (col1...'

有什么方法可以检索响应集,即可以具有数据类型定义(例如 Varchar(1000) 或 STR)的单个列(例如 Col1)?

问候,

标签: pythonpandas

解决方案


如果从 using 运行相同的查询pgadmin工作正常,也许尝试直接从psycopg2? 尝试使用以下代码块代替pandas

cur = conn.cursor()
cur.execute(createTable_sql)
result = cur.fetchall()

推荐阅读