python - 如何避免返回集的 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)?
问候,
解决方案
如果从 using 运行相同的查询pgadmin
工作正常,也许尝试直接从psycopg2
? 尝试使用以下代码块代替pandas
:
cur = conn.cursor()
cur.execute(createTable_sql)
result = cur.fetchall()
推荐阅读
- java - 我有一个(单个)类别和子类别树,现在我想在其中添加项目作为 treeNode
- apache-kafka - Zookeeper 未发现活跃消费者
- yii2 - 表单操作 url 在 yii2 框架中不起作用
- python - 熊猫每天新专栏
- c# - 如何在 http trigger azure function app 中添加自定义启动类
- python - python while循环和字典有问题
- scala - Scala -Spark,Spark SQL 中的 selectExpr 用于带双引号的动态字符串
- python - 使用 python 从头开始构建语音到文本系统
- matlab - 如何在 Octave 中将两个 8 位数字组合为 16 位
- msix - 向 Microsoft Store Developer Backend 提交 MSIX 文件的问题(发布者显示名称错误)