как избежать усечения данных read_sql_query для возвращаемого набора

#python #pandas

#python #pandas

Вопрос:

Я выполняю команду sql, которая возвращает инструкцию create table, предоставленную моей базой данных 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) 
  

Моя область создает таблицу. Сценарий создания таблицы возвращается PostgreSQL после выполнения через Pandas / Python команды «pd.read_sql_query».

Если я выполняю «createTable_sql» в интерпретаторе pgsql (например, pgadmin и т.д.), Он работает нормально, и в результате у меня есть только один столбец, содержащий ожидаемый оператор create table, или просто обычная строка длиной 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 (db engine), является:

 ' 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 …’

Могу ли я каким-либо образом получить набор ответов, то есть один столбец (например, Col1), который может иметь определение типа данных, такое как Varchar (1000) или STR?

С уважением,

Комментарии:

1. Можете ли вы (1) уточнить, пытаетесь ли вы создать таблицу в Postgresql с использованием pandas read_sql_query , и (2) опубликовать примеры выходных данных, которые у вас есть в данный момент, и примеры ожидаемых выходных данных?

2. @tnwei: я обновил свой первоначальный пост. Надеюсь, теперь это намного понятнее

Ответ №1:

Если выполнение того же запроса из using pgadmin работает нормально, возможно, попробуйте выполнить запрос напрямую из psycopg2 ? Попробуйте следующий фрагмент кода вместо pandas :

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

Комментарии:

1. спасибо:) Я мог бы поцеловать тебя. Вчера я потратил кучу времени, пытаясь разделить возвращаемую строку на более мелкие фрагменты, просто чтобы избавиться от усечения, и это был кошмар. Еще раз большое спасибо.