SQLite3+Flask开发问题:属性重复显示及删除后数据残留
问题解决:Flask+SQLite3 重复显示name及删除后数据残留
一、先搞定重复显示的根源
别只靠SELECT DISTINCT临时凑活,先排查数据重复的核心原因:
- 检查你的数据库初始化代码:如果每次启动Flask或每次请求都执行插入操作,数据必然重复。必须改成仅在表不存在或为空时初始化数据。
- 示例正确的初始化逻辑:
def init_db(): conn = sqlite3.connect('your_db.db') c = conn.cursor() # 仅当表不存在时创建 c.execute('''CREATE TABLE IF NOT EXISTS your_table (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT)''') # 仅当表为空时插入初始数据 c.execute('SELECT COUNT(*) FROM your_table') if c.fetchone()[0] == 0: c.execute("INSERT INTO your_table (name) VALUES ('name1')") c.execute("INSERT INTO your_table (name) VALUES ('name2')") conn.commit() conn.close() # 启动时只执行一次初始化,别放进路由里 init_db()
二、解决删除后数据残留的问题
这通常是两个原因:事务没提交、浏览器缓存了旧页面。
- 确保删除操作提交事务
Python的sqlite3模块默认不会自动提交,删除后必须调用conn.commit(),还要记得关闭连接:
@app.route('/delete/<name>') def delete_name(name): conn = sqlite3.connect('your_db.db') c = conn.cursor() c.execute('DELETE FROM your_table WHERE name = ?', (name,)) # 必须提交! conn.commit() conn.close() return redirect('/')
- 禁止浏览器缓存页面
给Flask添加响应头,强制浏览器每次请求都拉取最新页面:
@app.after_request def disable_cache(response): response.cache_control.no_store = True response.cache_control.must_revalidate = True response.headers['Pragma'] = 'no-cache' response.headers['Expires'] = '0' return response
三、确保展示唯一name的最终查询
如果业务场景允许数据重复但展示要去重,用SELECT DISTINCT或者GROUP BY都可以,效果一致:
@app.route('/') def index(): conn = sqlite3.connect('your_db.db') c = conn.cursor() # 方式1:DISTINCT去重 c.execute('SELECT DISTINCT name FROM your_table') # 方式2:GROUP BY去重 # c.execute('SELECT name FROM your_table GROUP BY name') names = [row[0] for row in c.fetchall()] conn.close() return render_template('index.html', names=names)
四、前端模板正确循环
确保index.html里的循环没有重复渲染:
<ul> {% for name in names %} <li>{{ name }}</li> {% endfor %} </ul>
内容的提问来源于stack exchange,提问作者JesusOfCarrots
相关产品推荐
相关产品推荐

