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

Python+SQLite3开发CRUD程序修改数据时出现OperationalError报错

问题:SQLite3修改数据时出现no such column错误

报错信息

line 45, in rename_data
    c.execute(f"UPDATE data SET nama={nama_baru} WHERE nama={nama_lama}")
sqlite3.OperationalError: no such column: Bintang

问题代码

创建表语句:

cur.execute("""CREATE TABLE IF NOT EXISTS data (nim integer not null, nama text, prodi text)""")

修改数据的函数:

c = con.cursor()
print('''
1.NIM
2.Nama
3.Jurusan
''')
user_input = int(input('Masukan Opsi: '))
if user_input == 1: 
    nim_lama = int(input('Masukan NIM lama = '))
    nim_baru = int(input('Masukan NIM baru = '))
    c.execute(f"UPDATE data SET nim={nim_baru} WHERE nim={nim_lama}")
    print(f'NIM sudah di ubah menjadi {nim_baru}')
elif user_input == 2: 
    nama_lama = str(input('Masukan Nama lama = '))
    nama_baru = str(input('Masukan Nama baru = '))
    c.execute(f"UPDATE data SET nama={nama_baru} WHERE nama={nama_lama}")
    print(f'Nama sudah di ubah menjadi {nama_baru}')
elif user_input == 3: 
    prodi_lama = str(input('Masukan Jurusan lama = '))
    prodi_baru = str(input('Masukan Jurusan baru = '))
    c.execute(f"UPDATE data SET prodi={prodi_baru} WHERE prodi={prodi_lama}")
    print(f'Mata Kuliah sudah di ubah menjadi {prodi_baru}')
con.commit()

错误原因

用f-string直接拼接SQL语句时,字符串类型的字段值(比如输入的"Bintang")没有被引号包裹,SQLite会把它识别为列名而非字段值,因此抛出"no such column"错误。另外,直接拼接用户输入还存在SQL注入风险,属于不安全的写法。

修复方案

使用SQLite3的参数化查询,用?作为占位符,将参数以元组形式传递给execute()方法。这种方式会自动处理字符串的引号包裹,同时避免SQL注入问题。

修复后的代码:

c = con.cursor()
print('''
1.NIM
2.Nama
3.Jurusan
''')
user_input = int(input('Masukan Opsi: '))
if user_input == 1: 
    nim_lama = int(input('Masukan NIM lama = '))
    nim_baru = int(input('Masukan NIM baru = '))
    c.execute("UPDATE data SET nim=? WHERE nim=?", (nim_baru, nim_lama))
    print(f'NIM sudah di ubah menjadi {nim_baru}')
elif user_input == 2: 
    nama_lama = input('Masukan Nama lama = ')  # str()可省略,input返回的就是字符串
    nama_baru = input('Masukan Nama baru = ')
    c.execute("UPDATE data SET nama=? WHERE nama=?", (nama_baru, nama_lama))
    print(f'Nama sudah di ubah menjadi {nama_baru}')
elif user_input == 3: 
    prodi_lama = input('Masukan Jurusan lama = ')
    prodi_baru = input('Masukan Jurusan baru = ')
    c.execute("UPDATE data SET prodi=? WHERE prodi=?", (prodi_baru, prodi_lama))
    print(f'Mata Kuliah sudah di ubah menjadi {prodi_baru}')
con.commit()

说明

  • 参数化查询会由SQLite自动处理数据类型转换和字符串的引号包裹,无需手动添加引号
  • 避免了用户输入包含特殊字符(比如单引号)导致的SQL语法错误
  • 从根本上杜绝了SQL注入攻击的风险

内容的提问来源于stack exchange,提问作者Bintang Hutabarat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 12:05:29