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'的多行表[重复]的主要内容,如果未能解决你的问题,请参考以下文章