2016-11-04 6 views
1

Ich versuche, Daten zu laden, die das Ergebnis einer Python 2.7-Bibliothek - pg8000 Abfrage gegen eine AWS Redshift-Tabelle ist.Redshift Werte in Tabelle einfügen

Zuerst Frage ich eine Redshift-Tabelle für Ergebnisse und es stellt sie in einem Tupel mit Werten in einer Liste.

Beispiel:

value_tuple = ([datetime.date(2016, 10, 2), 1, 1, 123123], [datetime.date(2016, 10, 2), 1, 2, 3131312]) 

Ich mag diese Werte in einer anderen Tabelle einfügen, aber in ein paar Probleme leite die Insert-Anweisung zu erstellen. Ich bin offen dafür, alle Werte einzeln einzugeben, aber ich würde lieber alle auf einmal machen.

Die Tabelle I mit wie folgt aussehen gerade arbeite:

| date_column | value_1 | value_2 | value_count | 
| 2016-10-01 | 1 | 2 |  300  | 

Zuerst habe ich versucht, eine Update-Abfrage zu erstellen, die

update_query = """insert into my_schema.my_table_to_update 
         values %s 
         """ % str(value_tuple[0]) 

Auf diese Weise der update_query nur eine einzige Liste innerhalb des Tupel verwendet wird:

'insert into my_schema.my_table_to_update\n      values [datetime.date(2016, 10, 2), 1, 1, 123123]\n      ' 

Wenn ich die Update-Abfrage für die Tabelle I diesen Fehler laufen:

pg8000.core.ProgrammingError: (u'ERROR', u'42601', u'syntax error at or near "["', u'70', u'/home/rdsdb/padb/src/pg/src/backend/parser/parser_scan.l', u'699', u'yyerror', u'', u'') 

Ich denke, das bedeutet, ich kann nicht das Listenformat der Ergebnisse in die Tabelle einfügen.

Was ist eine zweckmäßige und vorzugsweise effiziente Methode zum Einfügen dieser Daten in Redshift?

Antwort

1

Ich bin nicht vertraut mit pg8000 also nehmen Sie das mit einem Körnchen Salz.

Die letzte Abfrage, die Sie wie am Ende ausführen wollen, sollten suchen:

INSERT INTO your_table (date_column, value_1, value_2, value_count) 
VALUES ('2016-10-02', 1, 2, 3131312); 

Sie sollten String-Interpolation mit SQL-Abfragen vermeiden, wie es Ihnen bis zu einem Injektions Angriff öffnen kann.

Ihre Bibliothek sollte eine eigene SQL-Safe-Parametrierung unterstützen (die auch für Sie die Quotierung übernimmt). Wenn es dem Python-DB-API-Standard folgt, sollte es eines davon sein: https://www.python.org/dev/peps/pep-0249/#paramstyle.

Mit was ich kenne (psycopg2 - http://initd.org/psycopg/docs/usage.html#passing-parameters-to-sql-queries) der Code würde wie folgt aussehen:

update_query = """insert into my_schema.my_table_to_update 
     (date_column, value_1, value_2, value_count) 
     VALUES (%s, %s, %s, %s);""" 
cur.execute(update_query, value_tuple) 

wie in Ihrem Fall Sounds könnte man es noch effizienter machen, indem sie alle in SQL zu tun. Wenn Sie Ihre erste Auswahl Abfrage, um die vier gewünschten Felder ergibt, die mit den korrekten Spaltennamen aliased werden kann (zum Beispiel: AS value_count), dann könnten Sie eine Abfrage mit einer Struktur wie folgt tun:

insert into my_schema.my_table_to_update (
    select date_column, value_1, value_2, value_count 
    from (your selection query here) 
); 
Verwandte Themen