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

Python SQLite插入报错:sqlite3.OperationalError: no such column: cities_name

问题解决:sqlite3.OperationalError: no such column: cities_name

错误根源

  1. INSERT语句格式错误:你写的insert or ignore into cities values (cities_name, city_population)中,cities_name和city_population被SQLite当作列名解析,而非你要插入的参数值;同时表结构定义了3个必填字段(city_id是主键且非空),但你只提供了两个值,不符合表结构要求。
  2. 人口数据类型不匹配:cities_list中的人口是带逗号/空格的字符串,无法直接插入integer类型的city_population字段。

修正方案

步骤1:调整表结构(让主键自动生成)

把city_id改为自增整数,这样插入数据时无需手动指定主键值:

cursor.execute("create table if not exists cities(city_id INTEGER PRIMARY KEY AUTOINCREMENT, cities_name text, city_population integer)")

步骤2:修正INSERT语句并处理数据

  • 使用SQL参数占位符?传递值,避免列名混淆
  • 清理人口数据中的逗号和空格,转为整数

修正后的完整代码:

import sqlite3

connection = sqlite3.connect("cities.db")
cursor = connection.cursor()

# 调整表结构,让city_id自动自增
cursor.execute("create table if not exists cities(city_id INTEGER PRIMARY KEY AUTOINCREMENT, cities_name text, city_population integer)")
    
# 处理人口数据:去掉逗号和空格,转为整数
cities_list = [
    ('Minneapolis', int('425,336'.replace(',', ''))),
    ('St. Paul', int('307,193'.replace(',', ''))),
    ('Dallas', int('1,288,000'.replace(',', ''))),
    ('Memphis', int('628, 127'.replace(',', '').replace(' ', ''))),
    ('San Francisco', int('815,201'.replace(',', ''))),
    ('Milwaukee', int('569,330'.replace(',', ''))),
    ('Denver', int('711,463'.replace(',', ''))),
    ('Phoenix', int('1,625,000'.replace(',', ''))),
    ('Chicago', int('2,697,000'.replace(',', ''))),
    ('New York', int('8,468,000'.replace(',', '')))
]

# 明确指定插入的列,使用?作为参数占位符
cursor.executemany("insert or ignore into cities (cities_name, city_population) values (?, ?)", cities_list)
connection.commit()  # 别忘了提交事务!

# 打印所有数据
for row in cursor.execute("select * from cities"):
    print(row)

print('******************************************')
# 查询指定城市
cursor.execute("select * from cities where cities_name=:c", {"c": "Minneapolis"})
search = cursor.fetchall()
print(search)

connection.close()

关键注意点

  • 执行插入/更新操作后必须调用connection.commit(),否则数据不会写入数据库
  • 使用参数占位符?或命名占位符(如:c)是SQLite操作的最佳实践,既避免语法错误,也能防止SQL注入
  • 确保插入的数据类型和表定义的字段类型匹配

内容的提问来源于stack exchange,提问作者Josh T

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 14:45:43