Python SQLAlchemy通道参数与GeoPandas.from_postgis

Python SQLAlchemy通道参数与GeoPandas.from_postgis,python,pandas,sqlalchemy,postgis,geopandas,Python,Pandas,Sqlalchemy,Postgis,Geopandas,在将GeoPandas功能与SQLAlchemy一起使用时,我希望将参数传递给sql查询 classmethod GeoDataFrame.from_postgis(sql,con,geom_col='geom',crs=None,index_col=None,强制_float=True,params=None) 我已经看过以前的一个类似的例子,它建议使用SQLAlchemy的选项。但是,这需要访问con.execute,它不包括在GeoDataFrame from_postgis选项中 您能建

在将GeoPandas功能与SQLAlchemy一起使用时,我希望将参数传递给sql查询

classmethod GeoDataFrame.from_postgis(sql,con,geom_col='geom',crs=None,index_col=None,强制_float=True,params=None)

我已经看过以前的一个类似的例子,它建议使用SQLAlchemy的选项。但是,这需要访问con.execute,它不包括在GeoDataFrame from_postgis选项中


您能建议将参数传递给SQL的最佳方法吗?如果不是直接从postgis中输入,那么如何最好地分别构造完整的SQL字符串,并将其作为第一个SQL参数传递给from postgis。

来自链接的类似问题:

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= "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,您可以使用以下方法添加参数:

对于在SQLAlchemy中构造的查询,绑定参数将自动包括:

foo = Table(...)  # you need to define foo
query = select(["*"]).select_from(foo).where(foo.c.bar == 1)
您还可以直接通过_postgis的
参数
传递参数,如果这更自然:

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

不要像另一个答案所建议的那样使用
str.format
,因为它容易受到SQL注入的影响。

对于文本SQL,您可以使用以下方法添加参数:

对于在SQLAlchemy中构造的查询,绑定参数将自动包括:

foo = Table(...)  # you need to define foo
query = select(["*"]).select_from(foo).where(foo.c.bar == 1)
您还可以直接通过_postgis
参数
传递参数,如果这更自然:

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

不要像另一个答案所建议的那样使用
str.format
,因为它容易受到SQL注入的攻击。

我发现geopandas/psychopg不喜欢SQL文本中的:param_name命名样式,但它确实使用了%(param_name)s样式。@Nij注意,在这种情况下,冒号样式直接由SQLAlchemy处理,不管数据库后端如何。如果您直接使用psycopg2,那么是的,您需要使用
pyformat
样式。我发现geopandas/Psycopg不喜欢sql文本中的:param_name命名样式,但它确实使用了%(param_name)s样式。@Nij注意,在这种情况下,冒号样式直接由SQLAlchemy处理,而不管数据库后端如何。如果您直接使用psycopg2,那么是的,您需要使用
pyformat
样式。