2017-07-18 16 views
0

SQLAlchemyでGeoPandas from_postgisの機能を使用するときに、パラメータをSQLクエリに渡したいとします。私は以前同様のを見てきましたSQLAlchemy GeoPandas.from_postgisでパラメータを渡す

クラスメソッドのGeoDataFrame.from_postgis(SQL、CON、geom_col = 'GEOM'、CRS =なし、index_col =なし、coerce_float =真、のparams =なし)

questionalso hereは、SQLAlchemyのtextual SQLオプションを使用することを示唆しています。ただし、これには、GeoDataFrame from_postgisオプションに含まれていないcon.executeへのアクセスが必要です。

パラメータをSQLに渡す最善の方法を提案できますか? from_postgisに直接ない場合は、完全なSQL文字列を個別に構築し、from_postgisの最初のsql引数として渡すのが最適です。

答えて

2

、あなたが.bindparamsを使用してパラメータを追加することができます

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

をあなたはSQLAlchemyの中に構築するクエリの場合、バインドパラメータが自動的に含まれています。あなたはまた、直接経由してパラメータを渡すことができ

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

paramsのパラメータがfrom_postgisであれば、それはより自然です:

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

もう1つの答えとして、str.formatを使用しないでください。これは、SQLインジェクションに対して脆弱であるためです。

0

リンク同様の質問から:

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

私は通常、単なる文字列の書式でパラメータを渡す:

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

制限は、一度に全てのパラメータを渡すために持っているか、あなたが取得することです設定する複数のパラメータがある場合は、フォーマットからのキーエラーです。

テキストSQLの場合