如何将用户输入变量传递给Sqalchemy语句?

时间:2019-02-21 15:30:59

标签: python postgresql pandas

我对编程世界还很陌生。我正在使用Python,Pandas和SQLlite;最近,我开始构建Postgresql数据库。我正在尝试查询一个postgres数据库,并使用结果创建一个Pandas数据框。我发现以下作品有效:

import pandas as pd
from sqlalchemy import create_engine # database connection
engine = create_engine('postgresql://postgres:xxxxx@localhost:xxxx/my_postgres_db')
df = pd.read_sql("SELECT * FROM my_table Where province='Saskatchewan'", engine)

工作正常,但我的问题是如何将用户输入传递给sql查询。具体来说,我想执行以下操作:

province_name = 'Saskatchewan' #user input
df = pd.read_sql("SELECT * FROM my_table Where province=province_name", engine)

但是,这将返回错误消息: ProgrammingError:(psycopg2.ProgrammingError)列“ province_selected”不存在 第1行:SELECT * FROM my_table,其中Province = province_selec ...

有人可以提供这方面的指导吗?另外,任何人都可以建议我如何处理Postgres数据库中带有“ /”等字符的字段名。我的数据库有一个称为CD / CSD的字段(列标题),当我尝试对该字段运行查询时(类似于上面的代码),我只会收到错误消息。任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:1)

您应该使用DBAl模块提供的功能,SQLAlchemy使用该功能将参数发送到查询。使用psycopg2可能看起来像这样:

province_name = 'Saskatchewan' #user input
df = pd.read_sql("SELECT * FROM my_table Where province=%s", engine, params=(province_name,))

这比使用Python的字符串格式将参数插入查询更安全。

Passing parameters using psycopg2

pandas.read_sql documentation

答案 1 :(得分:0)

关于第一个问题,目前您正在将以下字符串传递给sql引擎: 'SELECT * FROM my_table Where province=province_name'

要将python代码中的'province_name'替换为变量province_name,可以使用format方法:

province_name = 'Saskatchewan' #user input
sql_command = "SELECT * FROM my_table Where province='{}'".format(province_name)
df = pd.read_sql(sql_command , engine)

format方法将{}替换为变量province_name的内容。 format方法有多种使用方式,this guide中对此进行了详细说明 编辑:请注意,正如其他人所述,由于您使用的是原始用户输入,因此存在安全隐患,因此其他方法更适合此实例。

答案 2 :(得分:0)

有很多方法可以做到这一点,最简单的是:

province_name = 'Saskatchewan' #user input
pd.read_sql("SELECT * FROM my_table Where province='%s'" % province_name, engine)

但这会带来安全问题,如果您不小心验证数据没有某种SQL注入。

答案 3 :(得分:0)

对于问题的第一部分,您可以使用字符串格式。您指定查询的方式将失败,因为它将搜索不存在的名为“ province_name”的列。有多种格式化字符串的方法,我将建议一种可在Python 3.5+中使用的方法。另请检查f strings是否适用于Python 3.6及更高版本。

代码可能看起来像这样:

import pandas as pd
from sqlalchemy import create_engine # database connection
engine = create_engine('postgresql://postgres:xxxxx@localhost:xxxx/my_postgres_db')
province_name = 'Saskatchewan' #user input
query = "SELECT * FROM my_table Where province={}".format(province_name)
df = pd.read_sql(query, engine)

如果您执行print(query),您将意识到这与成功的结果完全一样。