postgresql友好地返回不是'PANDAS'的多行表[重复]

Posted

技术标签:

【中文标题】postgresql友好地返回不是\'PANDAS\'的多行表[重复]【英文标题】:postgresql return multirow table that is not 'PANDAS' freindly [duplicate]postgresql友好地返回不是'PANDAS'的多行表[重复] 【发布时间】:2019-10-12 15:35:37 【问题描述】:

我正在从 mysql 迁移到 postgresql,并且 postgresql 函数的输出出现问题。在 mysql 它返回数据元组,但 postgresql 它返回字符串列表 模拟问题:

CREATE TABLE public.dummy
(
    id1 integer,
    id2 integer,
    label text COLLATE pg_catalog."default"
)

INSERT INTO public.dummy(id1, id2, label) VALUES (1, 2, 'a');
INSERT INTO public.dummy(id1, id2, label) VALUES (2, 3, 'b');
INSERT INTO public.dummy(id1, id2, label) VALUES (3, 4, 'c');

CREATE FUNCTION public."test"(IN id integer)
    RETURNS TABLE 
    (id1  integer,
     id2 integer,
     label text)
    LANGUAGE 'sql'

AS $BODY$
SELECT  * from dummy;
$BODY$;

使用 psycopg2 和 pandas 创建简单的连接

sqlconn="postgresql+psycopg2://" + user + ":" + password + "@"+ host + ":"+str(port)+"/" + db 
engine = sqlalchemy.create_engine(sqlconn,encoding='utf8')
conn=engine.connect()
result=conn.execute('select test(1)')
resultset=result.fetchall()

这将产生

[('(1,2,a)',), ('(2,3,b)',), ('(3,4,c)',)]

转换成熊猫

pd.DataFrame(resultset)

产量

         0
0  (1,2,a)
1  (2,3,b)
2  (3,4,c)

我想要的是输出

pd.read_sql('select * from dummy',conn)


id1  id2 label
0    1    2     a
1    2    3     b
2    3    4     c

我不能一直使用 read_sql 方法,因为许多函数太复杂而无法放入字符串中,我在使用 MySQL/MariaDB 时从未遇到过这个问题 有人遇到过这个问题吗?

【问题讨论】:

【参考方案1】:

你想select * from test(1) 而不是select test(1)。当您select test(1) 时,它可能只返回一列(因为这是您选择的全部),因此它将每个表行打包成一个 RECORD 类型的对象,而不是扩展的多列格式。

【讨论】:

以上是关于postgresql友好地返回不是'PANDAS'的多行表[重复]的主要内容,如果未能解决你的问题,请参考以下文章

懒惰地从 PostgreSQL / Cassandra 创建 Dask DataFrame

pandas 8 个常用的 option 设置

好习惯!pandas 8 个常用的 option 设置

在查询中返回 Null,而不是 NaN

Pandas corr() 过于频繁地返回 NaN

当返回类型是表名时,为啥 PostgreSQL 函数返回空列而不是没有行?