在Python中将PostgreSQL表打印到标准输出

11

我在postgresql中有一张名为mytable的表格,我需要从一个Python应用程序中将该表格的内容打印到标准输出(stdout)。

目前我的操作如下:

        conn = psycopg2.connect("dbname=postgres user=postgres password=psswd")
        cur = conn.cursor() 
        cur.copy_to(sys.stdout,'mytable',sep = '\t')

然而,在某些列之间打印时,我得到了一些“\N”。我相信这种情况发生的原因是在打印过程中,该行超出并进入下一行,因此这些“\N”显示出来。

输出:

E0307   1       M       400     Ethan   UTDallas        12.98580404     \N      50.79403657     1
E0307   1       M       400     Lucas   Baylor  15.18511175     \N      56.87285183     3
E0307   1       M       400     Jackson Baylor  13.64228411     \N      56.87285183     3
E0307   1       M       400     Jacob   Baylor  13.19878974     \N      56.87285183     3
E0307   1       M       400     Samuel  Baylor  14.84666623     \N      56.87285183     3

我的问题如下:
  1. 如何消除输出中的 \N?有没有其他打印表格的方法?我试图避免执行整个“SELECT * FROM my_table”查询的方式。只需使用要打印的表格名称即可。

  2. 此外,在打印时如何获取表头?我尝试了以下内容:

    cur.execute("COPY mytable TO STDOUT with csv header")

我收到了这个错误消息:

ProgrammingError: can't execute COPY TO: use the copy_to() method instead

此外,我不确定这是否是最好的方法。但是这是我尝试过的事情 :)
3个回答

7

您手头没有PostgreSQL表以测试这个问题,但这对您有用吗?

import psycopg2 as pg
import pandas as pd
import pandas.io.sql as psql

connection = pg.connect("dbname=postgres user=postgres password=psswd")
#my_table   = pd.read_sql_table('table_name', connection)
my_table    = pd.read_sql('select * from my-table-name', connection)
another_attempt= psql.read_sql("SELECT * FROM my-table-name", connection)

print(my_table)

# OR
print(another_attempt)

我得到了这个错误:Traceback (most recent call last): File "<ipython-input-39-731d90653fa9>", line 1, in <module> my_table = pd.read_sql_table('team_totals', connection) File "C:\Users\peshalnayak\Anaconda3\lib\site-packages\pandas\io\sql.py", line 351, in read_sql_table raise NotImplementedError("read_sql_table only supported for SQLAlchemy connectable. - blabla
好的,我会更新我的答案,使用read_sql函数来执行查询。 - Max Power
好的,希望 my_tableanother_attempt 行起作用。一个使用标准的 pd_read_sql,第二个使用 pd.io.sql,我发现它专门用于连接到 postgres。好奇哪个有效,或者两个都有效。 - Max Power

3
那个\N是默认的空值文本表示。它可以通过使用copy_tonull参数进行更改。
要在输出中包含标题,请使用copy_expert
copy = "copy mytable to stdout with csv header delimiter '\t' null 'NULL'"
cursor.copy_expert(copy, sys.stdout)

1

如Neto先前所述:cur.copy_expert("sql statement", sys.stdout)将会起作用。要使用copy_to,您需要传递null参数。

如果您选择使用copy_to方法,请尝试此操作(设置null值-请参阅文档)。首先打印列名。

header = [i[0] for i in cur.description
print header
cur.copy_to(sys.stdout, 'table', sep='\t', null='\N')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接