我在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
我的问题如下:
如何摆脱输出中的这些\ N?是否有另一种打印表格的方法?我试图避免我必须执行整个" SELECT * FROM my_table"查询。只使用要打印的表名称的东西。
另外,如何在打印时获取表格标题?我尝试了以下方法:
cur.execute("使用csv标题&#34复制mytable to STDOUT;)
我收到此错误消息:
ProgrammingError: can't execute COPY TO: use the copy_to() method instead
另外,我不确定这是不是最好的方法。但我试图做的事情:)
答案 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)
\N
是null
值的默认文本表示形式。可以使用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')