首页 > 解决方案 > 带有变量的烧瓶 postgres 动态查询字符串

问题描述

我正在尝试使用变量动态查询 PostgresSQL 表。例如,当用户输入 a 时name,我希望用户被重定向到显示与之关联的表数据的页面name(数据库表中name在特定列中具有该数据的行)。我知道我已正确连接到 PostgresSQL 数据库。

在我的 Flask app.py文件中,我有:

@app.route("/test")
def hello():
    html = render_template('test_index.html')
    return html

@app.route("/results")
def goodbye():
    x =  request.args.get('stuff')
    image=sql("SELECT * FROM image WHERE image_id = '%s'" % ({x}))
    html = render_template('test_results.html', target=x, image=image)

    return html

在我的test_index.html模板中,我有:

<h1>Hello</h1>
<form action="{{url_for('goodbye')}}" method="get">
  <input type="text" name="stuff" value="type something!">
  <input type="submit" value="Submit">
</form>

在我的test_results.html模板中,我有:

 <h1>Image ID:</h1>
 <h2>{{target}}</h2>

<table>
  <tr>
    <th>Image ID</th>
{% for images in image %}
  <tr>
    <td>{{ images.image_id }}</td>
  </tr>

{% endfor %}

当我输入名称时,我收到此错误:

ProgrammingError: (psycopg2.ProgrammingError) 在“John” LINE 1 或附近出现语法错误:SELECT * FROM image WHERE image_id = 'set([u'John'...

有没有办法使这种通过字符串动态查询的方法成为可能?还是我以不正确的方式处理这个问题?(我是否必须声明一个模型并以这种方式处理它?)

标签: pythonsqlalchemy

解决方案


从文档:http ://docs.sqlalchemy.org/en/latest/orm/session_api.html

您的方法很准确,您的烧瓶应用程序中的 sql 语句中只有一个小问题。试试这个:

@app.route("/test")
def hello():
    html = render_template('test_index.html')
    return html

@app.route("/results")
def goodbye():
    x =  request.args.get('stuff')
    image = sql("SELECT * FROM image WHERE image_id=:image_id_input;", 
        {"image_id_input": x})
    html = render_template('test_results.html', target=x, image=image)

    return html

我还假设您希望更新您的 sql 查询语句以仅选择您有兴趣显示的图像字段。当前图像将是一个列表列表,每个内部列表都是匹配行的列。


推荐阅读