You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask+SQLite3访客注册程序绑定数量不匹配错误求助

解决SQLite3绑定参数错误及访客注册程序的完整修复方案

嘿Ronny,我来帮你解决这个数据库写入的问题!你遇到的sqlite3.ProgrammingError: Incorrect number of bindings supplied错误,本质是函数职责混乱+参数传递错误导致的,咱们一步步拆解修复:

错误根源分析

你的create_table函数被写成了插入数据的逻辑,但你调用它的时候传入的是建表的SQL字符串。SQLite会把这个长字符串拆成单个字符当作绑定参数,自然就出现了"需要4个参数但收到402个"的错误。


完整修复步骤

1. 拆分建表与插入数据的函数

把原来混乱的函数拆成两个各司其职的函数:

from flask import Flask, render_template, url_for, request, redirect
from datetime import datetime
import sqlite3
from sqlite3 import Error

app = Flask(__name__)

# 创建数据库连接
def create_connection(db_file):
    connection = None
    try:
        conn = sqlite3.connect(db_file)
        print(f"SQLite versie: {sqlite3.version}")
    except Error as e:
        print(e)
    return conn

# 专门创建访客数据表的函数
def create_guest_table(conn):
    sql_create_table = """ CREATE TABLE IF NOT EXISTS guests (
                                        id integer PRIMARY KEY,
                                        voor_naam text NOT NULL,
                                        achter_naam text NOT NULL,
                                        bedrijfs_naam text NOT NULL,
                                        datum date NOT NULL
                                    ); """
    try:
        cursor = conn.cursor()
        cursor.execute(sql_create_table)
    except Error as e:
        print(e)

# 专门插入访客数据的函数
def insert_guest(conn, guest_data):
    sql_insert = """ INSERT INTO guests(voor_naam,achter_naam,bedrijfs_naam,datum)
              VALUES(?,?,?,?) """
    cursor = conn.cursor()
    cursor.execute(sql_insert, guest_data)
    conn.commit()  # 必须提交事务才能保存数据
    return cursor.lastrowid

2. 修正初始化数据库的逻辑

原来的main函数参数传递错误,现在改成正确调用:

def init_database():
    database = "gast.db"
    conn = create_connection(database)
    if conn is not None:
        create_guest_table(conn)
        conn.close()  # 用完连接记得关闭
    else:
        print("Fout! Kon geen databaseverbinding maken.")

3. 修复Flask路由的数据库操作问题

你的/my_form路由有三个问题:没有正确创建连接、用了MySQL风格的%s占位符、表名写法错误,修复后:

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

@app.route('/my_form', methods=['POST'])
def my_form():
    if request.method == 'POST':
        # 获取表单数据
        guest_vnaam = request.form.get('Voornaam')
        guest_anaam = request.form.get('Achternaam')
        guest_cnaam = request.form.get('Bedrijfsnaam')
        guest_datum = request.form.get('Datum')

        # 创建数据库连接
        conn = create_connection("gast.db")
        if conn is None:
            return 'Kon geen verbinding met de database maken'
        
        try:
            # 把数据整理成元组(SQLite要求的参数格式)
            guest_tuple = (guest_vnaam, guest_anaam, guest_cnaam, guest_datum)
            insert_guest(conn, guest_tuple)
            conn.close()
            return redirect('/')
        except Error as e:
            conn.close()
            return f'Er ging iets fout met het opslaan van uw gegevens: {str(e)}'

4. 整理程序入口

把多个重复的if __name__ == '__main__':合并,确保执行顺序正确:

if __name__ == '__main__':
    # 先初始化数据库表
    init_database()
    # 再启动Flask应用
    app.run(debug=True)

额外优化建议

  • 可以自动填充日期:把guest_datum = request.form.get('Datum')改成guest_datum = datetime.now().strftime('%Y-%m-%d'),减少用户输入
  • 可以用Flask的上下文管理器简化连接管理:比如with sqlite3.connect("gast.db") as conn:,自动处理连接关闭
  • 你的HTML表单是正确的,name属性和后台获取的键完全对应,不需要修改

内容的提问来源于stack exchange,提问作者Ronny Giezen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:17:40