【问题标题】:Unable to fetch data from PostgreSQL table connected using Python无法从使用 Python 连接的 PostgreSQL 表中获取数据
【发布时间】:2021-04-30 05:22:11
【问题描述】:

我可以使用这个命令获取数据:

connection = psg.connect( database = "Test" , host="localhost", user="postgres", password="password")
data_1 = psql.read_sql('SELECT * FROM table_1 WHERE id IN (101 , 102)', connection)

但是当我运行下面的命令时,它给了我一个错误。用户将输入动态 ID 值,并显示与尊重的 ID 对应的数据。这就是为什么要在用户界面上创建一个变量的原因。

connection = psg.connect( database = "Test" , host="localhost", user="postgres", password="password")
variable_p = (108 ) # 108 is the id column value.
data_1 = psql.read_sql('SELECT * FROM table_1 WHERE id IN (variable_p[0])', connection)

Error - Column variable_p does not exist. 

【问题讨论】:

    标签: python sql postgresql jupyter-notebook data-science


    【解决方案1】:

    您没有在读取的 sql 字符串中使用变量 variable_p。您可以在此处使用 f 字符串:

    connection = psg.connect( database = "Test" , host="localhost", user="postgres", password="password")
    variable_p = 108  # don't need parentheses for single value
    data_1 = psql.read_sql(f'SELECT * FROM table_1 WHERE id = {variable_p}', connection)
    

    但是在这里你很容易受到 SQL 注入的攻击。因此,请尝试对您的查询进行参数化以使其安全。

    参数化和使用WHERE IN 这可能类似于(未经测试):

    variable_p = (1, 2, 3)
    data_1 = psql.read_sql('SELECT * FROM table_1 WHERE id IN %s', connection, params=variable_p)
    

    【讨论】:

    • 这在 variable_p = 108 时效果很好,但是当 variable_p 可以取 2 到 3 个整数值时,比如 variable_p = 101 , 102 , 108 那么它不起作用,错误 - 运算符不存在:整数记录。
    • 是的,由于存在 SQL 注入的风险,构建动态且安全的 WHERE IN 字符串可能有点繁琐。
    • @Andrew 我已经用建议更新了答案。
    • 我再次使用您更新的代码得到了错误。错误:在 sql 上执行失败:并非所有参数都在字符串格式化期间转换。
    • 也许 params 需要一个列表,试试params=[variable_p]
    猜你喜欢
    • 1970-01-01
    • 2019-07-04
    • 1970-01-01
    • 2018-10-29
    • 1970-01-01
    • 2013-04-13
    • 2023-02-14
    • 1970-01-01
    • 2018-12-24
    相关资源
    最近更新 更多