2017-04-13 2 views
2

Ich habe eine Tabelle in postgresql namens mytable und ich muss den Inhalt dieser Tabelle von einer Python-Anwendung auf stdout drucken.Drucken Sie eine postgresql-Tabelle auf die Standardausgabe in Python

Ich mache zur Zeit wie folgt zusammen:

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

Allerdings bekomme ich einige "\ N", wenn sein zwischen einigen Spalten gedruckt in. Ich glaube der Grund, warum dies passiert, ist, weil irgendwo während des Druckprozesses die Linie überschreitet und zur nächsten Linie in der Psql-Terminal geht und so diese \ N s auftauchen.

Ausgang:

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 

Meine Frage ist folgende:

  1. Wie werde ich von diesen befreien \ N in der Ausgabe? Gibt es eine alternative Möglichkeit, eine Tabelle zu drucken? Ich versuche Wege zu vermeiden, auf denen ich eine komplette "SELECT * FROM my_table" -Abfrage ausführen muss. Etwas, das nur den Namen der zu druckenden Tabelle verwendet.

  2. Wie bekomme ich auch die Tabellenköpfen beim Ausdrucken? Ich habe versucht, die folgenden:

    cur.execute ("COPY TO Mytable mit csv-Header stdout")

Ich bekomme diese Fehlermeldung:

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

Auch ich bin nicht sicher, wenn das der beste Weg ist. Aber etwas, was ich versuchte zu tun :)

Antwort

0

Haben Sie keine Postgress-Tabelle, um das zu testen, aber funktioniert das für Sie?

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

ich diesen Fehler: Traceback (jüngste Aufforderung zuletzt): Datei "" Linie 1 in my_table = pd.read_sql_table ('team_totals ‘, Verbindung) Datei "C: \ Benutzer \ peshalnayak \ Anaconda3 \ lib \ site-packages \ pandas \ io \ sql.py", Linie 351, in read_sql_table Erhöhung NotImplementedError ("read_sql_table nur unterstützt" NotImplementedError : read_sql_table wird nur für SQLAlchemy connectable unterstützt. – foobar

+0

ok Ich werde meine Antwort aktualisieren, um die read_sql-Funktion zu verwenden, die eine Abfrage –

+0

akzeptiert, in der Hoffnung, dass entweder die Zeilen "my_table" oder "another_attempt" funktionieren. einer verwendet den Standard 'pd_read_sql', der zweite verwendet' pd.io.sql', was ich speziell für die Verbindung zu Postgres vorgeschlagen habe. Neugierig, was funktioniert oder wenn beides funktioniert. –

2

Das \N ist die Standard-Textdarstellung eines null Wert. Es kann mit den null parameter of copy_to

geändert werden, um die Überschriften in der Ausgabe copy_expert

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

Wie bereits erwähnt von Neto verwenden: cur.copy_expert("sql statement", sys.stdout) funktioniert. Um copy_to zu verwenden, müssen Sie null param übergeben.

Versuchen Sie dies, wenn Sie die copy_to-Methode wählen (Nullwert setzen - siehe Dokumentation). Drucken Sie zuerst die Spaltennamen.

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