Pandas read_sql mit Parametern

Gibt es Beispiele für die Übergabe von Parametern mit einer SQL-Abfrage in Pandas?

Insbesondere verwende ich eine SQLAlchemy-Engine, um eine Verbindung zu einer PostgreSQL-database herzustellen. Bisher habe ich festgestellt, dass Folgendes funktioniert:

df = psql.read_sql(('select "Timestamp","Value" from "MyTable" ' 'where "Timestamp" BETWEEN %s AND %s'), db,params=[datetime(2014,6,24,16,0),datetime(2014,6,24,17,0)], index_col=['Timestamp']) 

Die Pandas-Dokumentation sagt, dass Params auch als Diktat übergeben werden können, aber ich kann das nicht zum Laufen bringen, nachdem ich zum Beispiel versucht habe:

 df = psql.read_sql(('select "Timestamp","Value" from "MyTable" ' 'where "Timestamp" BETWEEN :dstart AND :dfinish'), db,params={"dstart":datetime(2014,6,24,16,0),"dfinish":datetime(2014,6,24,17,0)}, index_col=['Timestamp']) 

Was ist der empfohlene path, um diese Arten von Abfragen von Pandas auszuführen?

Die read_sql Dokumentation read_sql dass dieses params Argument eine list, ein Tupel oder ein dict sein kann (siehe Dokumentation ).

Um die Werte in der SQL-Abfrage zu übergeben, sind verschiedene Syntaxen möglich:? , :1 ,: :name , %s , %(name)s (siehe PEP249 ).
Aber nicht alle diese Möglichkeiten werden von allen databasetreibern unterstützt. psycopg2 Syntax unterstützt wird, hängt von dem Treiber ab, den Sie verwenden ( psycopg2 in Ihrem Fall, nehme ich an).

Im zweiten Fall, wenn Sie ein dict verwenden, verwenden Sie 'named arguments', und gemäß der psycopg2 Dokumentation unterstützen sie den %(name)s Stil (und nicht den :name ich vermute), siehe http: // initd.org/psycopg/docs/usage.html#query-parameters .
Also sollte dieser Stil funktionieren:

 df = psql.read_sql(('select "Timestamp","Value" from "MyTable" ' 'where "Timestamp" BETWEEN %(dstart)s AND %(dfinish)s'), db,params={"dstart":datetime(2014,6,24,16,0),"dfinish":datetime(2014,6,24,17,0)}, index_col=['Timestamp']) 

Ich verwende dieses Setup mit SQLite, was bedeutet, dass ich Parameter in Python und nicht in Pandas speziell behandeln kann. functioniert gut für mich und einfacher zu lesen, dann casting Sie eine Anfrage und Parameter direkt in read_sql.

 con = sqlite3.connect("mydb.db") verses_sql = '''SELECT kjv.b, kjv.id, kjv.t, kjv.v, ke.n, ke.author FROM t_kjv kjv LEFT JOIN key_english ke on kjv.b = ke.b WHERE blah = %s''' % blah df_verses = pd.read_sql(verses_sql, con, index_col='id') 

Auf diese Weise können Sie auch ein Diktat an die mehrzeilige characterfolge übergeben, wenn Sie dies bevorzugen:

 >>> d = { 'vars': "variables", 'example': "example" } >>> s = "This is an {example} with {vars}" >>> s.format(**d) 'This is an example with variables'