如何修复错误消息(sqlite3.ProgrammingError:提供的绑定数不正确,当前语句使用0,但提供了1,)

piwo6bdm  于 2023-03-03  发布在  SQLite
关注(0)|答案(2)|浏览(188)

我试图创建一个网站,过滤器使用4个不同的SQL表(字典是附加)数据郊区
但是,这个错误信息不断弹出;
sqlite3.ProgrammingError:提供的绑定数不正确。当前语句使用0,但提供了1。)
我该怎么补救呢?
Python代码:

from flask import Flask, render_template, request
import sqlite3

app = Flask(__name__)

@app.route('/')
def home():
    return render_template('home.html')

@app.route('/result', methods=['POST'])
def result():
    
    parks = request.form.get('parks')
    wifi = request.form.get('wifi')
    libraries = request.form.get('libraries')
    schools = request.form.get('schools')

    conn = sqlite3.connect('suburb.db')
    c = conn.cursor()

    c.execute("SELECT suburb FROM park WHERE EXISTS (SELECT suburb FROM library WHERE library.suburb =park.SUBURB ) =?", (parks,))
    park_subs = [row[0] for row in c.fetchall()]

    c.execute("SELECT suburb FROM wifi WHERE EXISTS (SELECT suburb FROM library WHERE library.suburb =wifi.suburb)", (wifi,))
    wifi_subs = [row[0] for row in c.fetchall()]

    c.execute("SELECT suburb FROM library", (libraries,))
    library_subs = [row[0] for row in c.fetchall()]

    c.execute("SELECT suburb FROM school WHERE EXISTS (SELECT suburb FROM library WHERE library.suburb =school.suburb)?", (schools,))
    school_subs = [row[0] for row in c.fetchall()]

    conn.close()
    
    
    
    result_subs = set(park_subs) & set(wifi_subs) & set(library_subs) & set(school_subs)
    return render_template('result.html', subs=result_subs)

if __name__ == '__main__':
    app.run

超文本:

<!DOCTYPE html>
<html>
<head>
    <title>Real Estate Filtering Website</title>
    <link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
    <h1>Real Estate Filtering Website</h1>
    <form method="POST" action="{{ url_for('result') }}">
        <h2>Filter by:</h2>
        <div class="filter">
            <input type="checkbox" name="parks" id="parks" value="yes">
            <label for="parks">Parks</label>
        </div>
        <div class="filter">
            <input type="checkbox" name="wifi" id="wifi" value="yes">
            <label for="wifi">Wifi Hotspots</label>
        </div>
        <div class="filter">
            <input type="checkbox" name="libraries" id="libraries" value="yes">
            <label for="libraries">Libraries</label>
        </div>
        <div class="filter">
            <input type="checkbox" name="schools" id="schools" value="yes">
            <label for="schools">Schools</label>
        </div>
        <input type="submit" value="Filter">
    </form>

    <div style="overflow-x:auto;">
        <table>
          <tr>
            <th>Suburb ID</th>
            <th>Suburb</th>
            <th> 
              {% for record in records %}  <!-- record is the list created from the python code. The for loop iterates through each record (row) -->
              <tr>
              {% for value in record %}    <!-- loop iterates through each value in the record list and generates a table cell for each peice of data -->
                  <td>{{ value }}</td>
              {% endfor %}
              </tr>
              {% endfor %}
              </table>
              </div>
</body>
</html>

我试过完全重新编程,但在制作替代系统时遇到了困难

im9ewurl

im9ewurl1#

在这条线上

c.execute(
    "SELECT suburb FROM wifi WHERE EXISTS (SELECT suburb FROM library WHERE library.suburb =wifi.suburb)",
    (wifi,)
)

您正在传递值(wifi,),但查询文本中没有占位符(?)。错误消息警告您不匹配。要修复此错误,请删除该值:

c.execute(
    "SELECT suburb FROM wifi WHERE EXISTS (SELECT suburb FROM library WHERE library.suburb =wifi.suburb)"
)
uqcuzwp8

uqcuzwp82#

上面代码中的错误是SQL查询的参数没有正确传递。不应该将参数作为execute()方法的第二个参数传递,而应该将它们作为第一个参数传递,将查询作为第二个参数传递。
例如,第一个查询应从:
c.execute("SELECT suburb FROM park WHERE EXISTS (SELECT suburb FROM library WHERE library.suburb =park.SUBURB ) =?", (parks,))
收件人:
c.execute(query="SELECT suburb FROM park WHERE EXISTS (SELECT suburb FROM library WHERE library.suburb =park.SUBURB ) =?", params=(parks,))

相关问题