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
相关产品推荐
相关产品推荐

