在python

时间:2017-04-13 01:45:32

标签: python postgresql etl psycopg2

我在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"当它打印在一些列之间。我相信发生这种情况的原因是因为在打印过程中的某个地方,线路超出并进入psql终端中的下一行,所以这些\ Ns显示出来。

输出:

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("使用csv标题&#34复制mytable to STDOUT;)

  3. 我收到此错误消息:

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

    另外,我不确定这是不是最好的方法。但我试图做的事情:)

3 个答案:

答案 0 :(得分:4)

没有便于测试这个的postgress表,但这对你有用吗?

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)

答案 1 :(得分:2)

\Nnull值的默认文本表示形式。可以使用null parameter of copy_to

进行更改

要让输出中的标题使用copy_expert

copy = "copy mytable to stdout with csv header delimiter '\t' null 'NULL'"
cursor.copy_expert(copy, sys.stdout)

答案 2 :(得分:0)

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

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

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