【问题标题】:Print a postgresql table to standard output in python在python中将postgresql表打印到标准输出
【发布时间】:2017-09-08 23:36:21
【问题描述】:

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

我目前正在做以下事情:

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

但是,当它打印在某些列之间时,我会得到一些“\N”。我相信发生这种情况的原因是因为在打印过程中的某个地方,该行超出并转到 psql 终端中的下一行,因此这些 \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

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

【问题讨论】:

    标签: python postgresql etl psycopg2


    【解决方案1】:

    没有方便的 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 行,在 my_table = pd.read_sql_table('team_totals' , 连接)文件“C:\Users\peshalnayak\Anaconda3\lib\site-packages\pandas\io\sql.py”,第 351 行,在 read_sql_table 中引发 NotImplementedError("read_sql_table only supported for " NotImplementedError: read_sql_table only supported for SQLAlchemy可连接。
    • 好的,我将更新我的答案以使用接受查询的 read_sql 函数
    • 好的,希望my_tableanother_attempt 行有效。一个使用标准pd_read_sql,第二个使用pd.io.sql,我发现它专门用于连接到postgres。好奇哪个有效,或者两者都有效。
    【解决方案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)
    

    【讨论】:

      【解决方案3】:

      正如 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')
      

      【讨论】: