2017-07-18 7 views
0

Ich möchte Parameter an eine SQL-Abfrage übergeben, wenn Sie GeoPandas from_postgis Funktionalität mit SQLAlchemy verwenden.SQLAlchemy übergeben Parameter mit GeoPandas.from_postgis

Class GeoDataFrame.from_postgis (SQL, con, geom_col = 'geom', crs = None, index_col = None, coerce_float = True, params = None)

ich in einem früheren ähnlichen ausgesehen haben question und also here, was die Verwendung der Option textual SQL von SQLAlchemy vorschlägt. Dies erfordert jedoch den Zugriff auf con.execute, der nicht in der Option GeoDataFrame from_postgis enthalten ist.

Können Sie die beste Methode zum Übergeben der Parameter an SQL vorschlagen? Wenn nicht direkt in from_postgis, dann wie kann man die vollständige SQL-Zeichenfolge am besten konstruieren und sie als erstes SQL-Argument an from_postgis übergeben.

Antwort

2

Für Text SQL, Sie Parameter mithilfe von .bindparams hinzufügen:

query = text("select * from foo where bar = :a").bindparams(a=1) 

Für Abfragen, die Sie in SQLAlchemy konstruieren, binden Parameter werden automatisch eingeschlossen:

foo = Table(...) # you need to define foo 
query = select(["*"]).select_from(foo).where(foo.c.bar == 1) 

Sie können auch über direkt Parameter übergeben der params Parameter von from_postgis, wenn das natürlicher ist:

df.from_postgis(text("select * from foo where bar = :a"), params={"a": 1}) 

Verwenden Sie nicht str.format als die andere Antwort schlägt vor, weil es anfällig für SQL-Injektion ist.

0

aus der verknüpften ähnliche Frage:

sql= "select geom, x,y,z from your_table" 

ich in der Regel nur Parameter übergeben mit String-Formatierung:

sql_base = "select geom, x,y,z from your_table where x > {x}" 
sql = sql_base.format(x=some_x_value) 

Eine Einschränkung ist, dass Sie alle Parameter auf einmal passieren müssen oder Sie erhalten ein Schlüsselfehler vom Format, wenn mehrere Parameter gesetzt werden müssen.