2016-12-09 1 views
0

Meine ursprüngliche Abfrage ist wieWie eine Liste mit Namen von Python filtern, wenn sie durch SQLAlchemy Abfrage

select table1.id, table1.value 
from some_database.something table1 
join some_set table2 on table2.code=table1.code 
where table1.date_ >= :_startdate and table1.date_ <= :_enddate 

, die in einer Zeichenfolge in Python gespeichert wird. Wenn ich

tun
x = session.execute(script_str, {'_startdate': start_date, '_enddate': end_date}) 

dann

x.fetchall() 

gibt mir die Tabelle ich will.

Nun ist die Situation, Tabelle 2 ist nicht mehr verfügbar für mich in der Oracle-Datenbank, stattdessen ist es in meiner Python-Umgebung als DataFrame verfügbar. Ich frage mich, was ist der beste Weg, um die gleiche Tabelle aus der Datenbank in diesem Fall zu holen?

Antwort

1

Sie können stattdessen die Klausel IN verwenden.

zuerst die join vom script_str entfernen:

script_str = """ 
select table1.id, table1.value 
from something table1 
where table1.date_ >= :_startdate and table1.date_ <= :_enddate 
""" 

, dann Codes von Datenrahmen erhalten: Jetzt

codes = myDataFrame.code_column.values 

, müssen wir dynamisch den script_str und die Parameter der Abfrage erweitern:

param_names = ['_code{}'.format(i) for i in range(len(codes))] 
script_str += "AND table1.code IN ({})".format(
    ", ".join([":{}".format(p) for p in param_names]) 
) 

erstellen dict mit allen Parametern:

params = { 
    '_startdate': start_date, 
    '_enddate': end_date, 
} 
params.update(zip(param_names, codes)) 

und führen Sie die Abfrage:

x = session.execute(script_str, params) 
+0

Danke, es funktioniert. Das einzige Problem ist, dass die maximale Anzahl von Ausdrücken in einer Liste 1000 ist, also muss ich mehrere Abfragen ausführen. – wh408

+1

Ja, es gibt eine Einschränkung. Wenn ich mich richtig erinnere, ist die "IN" -Klausel aus Performance-Sicht nicht die beste Option. Abhängig von den Indizes in Ihrer Datenbank möchten Sie möglicherweise noch kleinere Teile aufteilen. – van

Verwandte Themen