我对编程世界还很陌生。我正在使用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的字段(列标题),当我尝试对该字段运行查询时(类似于上面的代码),我只会收到错误消息。任何帮助将不胜感激。
答案 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的字符串格式将参数插入查询更安全。
答案 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),您将意识到这与成功的结果完全一样。