2016-06-29 19 views
0

Ich muss eine SQL (Redshift) -Abfrage ausführen, und ich arbeite derzeit mit einem Jupyter/Ipython-Notebook. Ich habe sqlalchemy-redshift.Kann 'json_extract_path_text' (Redshift) nicht mit sqlalchemy verwendet werden?

from sqlalchemy import create_engine, text 
engine_string = databasepwrd.redshiftconnection() 
engine = create_engine(engine_string) 
from pandas.io import sql 

def run_query(sequalese): 
    '''returns a dataframe given a string SQL query''' 
    sql_query = text(sequalese) 
    df = sql.read_sql(sql_query,engine) 
    return df 

run_query(""" 
SELECT deviceid, json_extract_path_text({extra_ctx, 'skip_login'}) 
FROM table 
LIMIT 10""") 

Wo extra_ctx 'eine Spalte in der Rotverschiebung Tabelle, die json Strings enthält.

Ich kenne meine Abfrage funktioniert, weil es läuft, wenn ich unsere Datenbank direkt über SQL Workbench abfragen. Wenn ich versuche, es in meinem Notebook zu laufen, erhalte ich die Fehlermeldung:

'ProgrammingError: (psycopg2.ProgrammingError) syntax error at or near "extra_ctx" 
LINE 1: SELECT user, json_extract_path_text({extra_ctx, 'skip_lo...' 

< - und ein wenig^verweist auf die ‚e‘ auf extra_ctx.

Alle Ideen, was das Problem verursacht werden könnte? Danke für jede Hilfe.

+0

Überprüfen Sie, wie Sie die [Funktion] (http://docs.aws.amazon.com/redshift/latest/dg/JSON_EXTRACT_PATH_TEXT.html) in SQL aufrufen, der Syntaxfehler ist genau richtig. Sie sollten einen Json-Wert * from_json * (zum Beispiel eine Spalte) als erstes Argument und variadische Textwerte als * path_elems * übergeben. Ihr aktuelles und einziges Argument ist nicht einmal gültiges SQL. Mit anderen Worten, entfernen Sie die geschweiften Klammern. –

+0

Vielen Dank für Ihre schnelle Antwort. Du hast Recht, anscheinend brauchte ich das {} nicht. Ich muss die Dokumente falsch gelesen haben - danke. – drxtrz

Antwort

0

Syntaxfehler. { nicht benötigt. Erzeugt keinen Fehler mit SQL Workbench, aber wenn ich Python durchlaufe.

SELECT deviceid, json_extract_path_text(extra_ctx, 'skip_login') 
FROM table 
LIMIT 10 

hat gut funktioniert. Danke, Ilja