【问题标题】:Is there a way to dynamically query a postgres db from Flask user inputs?有没有办法从 Flask 用户输入动态查询 postgres 数据库?
【发布时间】:2019-01-30 12:07:20
【问题描述】:

我需要根据 Flask Web 应用程序用户输入动态查询我的 Postgres 数据库。我让它在 Python 中工作,但是当我将它移到 Flask 时它停止工作。我已将其范围缩小到将变量插入到查询中的问题。

def predict_page(): 
    address_lookup = '10 West 28 Street' 
    # eventually this would take a user input like below 
    # address_lookup = request.args.get('address') 
    sq = """SELECT noise, population_density, median_home_value, 
            median_household_income, yearbuilt, vacant FROM     
            lookup_table WHERE address = %(input_address)s;""" 
    param = {'input_address':address_lookup} 
    query_results = pd.read_sql_query(sq, con, params = param)                   
    query_results = query_results.to_json() 
    return query_results

当我在查询中明确写入地址而不是变量时,它会起作用。

def predict_page(): 
    sq = """SELECT noise, population_density, median_home_value,          
    median_household_income, yearbuilt, vacant FROM lookup_table 
    WHERE address = '10 West 28 Street';""" 
    query_results = pd.read_sql_query(sq, con) 
    query_results = query_results.to_json() 
    return query_results

【问题讨论】:

  • 我投票决定关闭它,因为实际问题只是缺少单引号。

标签: python pandas flask


【解决方案1】:

我认为您所缺少的只是sq 字符串中的单引号:

address_lookup = '10 West 28 Street'
sq = """SELECT noise, population_density, median_home_value, 
median_household_income, yearbuilt, vacant FROM
lookup_table WHERE address = '%s';""" % address_lookup

print sq

输出:

SELECT noise, population_density, median_home_value, 
median_household_income, yearbuilt, vacant FROM
lookup_table WHERE address = '10 West 28 Street';

注意

我写了这个答案,以便它可以独立运行,因为我想专注于缺少单引号的问题。任何使用read_sql_query 的人都应该使用允许服务器进行输入清理所需的任何参数传递语法。您希望通过使用 Python 格式将参数插入 SQL 查询字符串来绕过服务器端参数验证。

【讨论】:

  • 啊,是的,我认为字符串末尾的 % 插入要好得多。有没有办法可以修改它以接受两个 WHERE 子句? (例如,WHERE address = '%s' AND zipcode = '%s' % address_lookup, zipcode_lookup)?
  • 我认为您仍然想使用您正在使用的任何查询语法,因为可能有一些服务器端参数sanitization 我不知道。我之所以这样写我的答案,是因为它将问题与其余代码隔离开来,并允许答案代码在没有导入的情况下运行。
  • 我实际上最终让它像这样工作:sq = """SELECT col1, col2, col3, col4 FROM table WHERE address = '{0}' AND zipcode = {1};""".format(address_lookup, zipcode_lookup) 你的回答帮助我到达那里,谢谢!
猜你喜欢
  • 2017-12-15
  • 2021-11-16
  • 1970-01-01
  • 2020-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多