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

Python+Sqlite插入行时批量更新整列场景编号问题

Flask场景编号重排逻辑修复

问题背景

在Flask页面中实现场景添加功能时,需要完成编号重排逻辑:当用户输入某个场景编号(例如"2"),若该编号已存在,需将现有编号为2的场景改为3、3改为4……以此类推,再插入新的场景行。目前初始插入逻辑正常,但重排后续行的逻辑存在缺陷,现有代码如下:

connection = sqlite3.connect('database')
connection.row_factory = sqlite3.Row
cursor = connection.cursor()
cursor.execute("SELECT SCENE FROM main")
scenelist = cursor.fetchall()
for oldscene in scenelist:
   if oldscene['SCENE'] == int(scene):
      newscene = (oldscene['SCENE'] + 1)
      cursor.execute("UPDATE MAIN SET SCENE = ? WHERE SCENE = ?", (newscene, scene))
cursor.execute("INSERT into MAIN (TITLE, LOCATION, CHAPTER, SCENE, TAGS) \
     VALUES (?, ?, ?, ?, ?)", (title, location, chapter, scene, tags,))

核心问题

现有代码仅处理了与输入编号完全匹配的行,未对大于输入编号的所有场景执行递增加1操作,无法实现完整的编号重排。

修复方案

优化后的代码

connection = sqlite3.connect('database')
connection.row_factory = sqlite3.Row
cursor = connection.cursor()

try:
    # 开启事务,保证操作原子性
    connection.execute("BEGIN TRANSACTION")
    
    target_scene = int(scene)
    # 批量更新所有>=目标编号的场景,编号+1
    cursor.execute("UPDATE MAIN SET SCENE = SCENE + 1 WHERE SCENE >= ?", (target_scene,))
    
    # 插入新场景行
    cursor.execute("INSERT into MAIN (TITLE, LOCATION, CHAPTER, SCENE, TAGS) \
         VALUES (?, ?, ?, ?, ?)", (title, location, chapter, target_scene, tags,))
    
    # 提交事务
    connection.commit()
except Exception as e:
    # 出错回滚,避免数据混乱
    connection.rollback()
    raise e
finally:
    # 关闭数据库连接
    connection.close()

关键改进点

  • 批量SQL更新:无需循环遍历所有场景,通过单条SQL语句直接处理所有符合条件的行,逻辑简洁且执行高效
  • 事务保障:将更新与插入操作纳入事务,确保要么全部成功,要么全部回滚,避免出现编号混乱的中间状态
  • 完整覆盖重排逻辑:WHERE SCENE >= ?条件会自动处理目标编号及所有后续编号的场景,完美实现"后续行依次递增加1"的需求

内容的提问来源于stack exchange,提问作者Mark Isom

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 21:42:41