2017-04-13 99 views
2

私はmytableという名前のpostgresqlのテーブルを持っています。このテーブルの内容をpythonアプリケーションからstdoutに出力する必要があります。pythonの標準出力にpostgresqlテーブルを出力する

 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( "CSVヘッダーとSTDOUT TO mytableはCOPY")

:私は次のことを試してみました

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

をまた、私はわからないんだけどこれが最善の方法であれば。しかし、私が何かしようとしたもの:

答えて

0

これをテストするのに便利なポストグレードテーブルはありませんが、これはあなたのために機能しますか?

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) 
+0

私はこのエラーを取得する: トレースバック(最新の呼び出しの最後を): MY_TABLE = pd.read_sql_table( 'team_totalsで ファイル ""、1行目を、 」、接続) ファイル "C:\ Users \ユーザーpeshalnayak \ Anaconda3 \ libには\サイト - パッケージ\パンダ\ IO \ sql.py"、行351、read_sql_table レイズNotImplementedError( NotImplementedError "read_sql_tableのみでサポートさ" で:read_sql_tableは、SQLAlchemy connectableでのみサポートされています。 – foobar

+0

ok私は 'my_table'または' another_attempt'のいずれかの行がうまく働くように、クエリを取るread_sql関数を使用するように答えを更新します。 –

+0

OK。 1つは標準の 'pd_read_sql'を使用し、2つ目は' post.res 'に接続するために特別に提案した 'pd.io.sql'を使います。好奇心が強い、または両方がそうである場合。 –

2

\Nnull値のデフォルトのテキスト表現されていること。動作しますcur.copy_expert("sql statement", sys.stdout):ネトで先に述べたようにcopy_expert

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

を使用する出力内のヘッダーを持っているためにnull parameter of copy_to

で変更することができます。 copy_toを使用するには、nullパラメータを渡す必要があります。

copy_toメソッド(null値を設定 - docsを参照)を選択した場合にこれを試してください。列名を最初に表示します。

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