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

