如何使用带空格的列名向SQLite插入数据?
解决PostgreSQL迁移SQLite时带空格列名的插入问题
错误原因
你在INSERT语句里给绑定参数:length (min)加了双引号,导致两个问题:
- SQLAlchemy错误地将
:length识别为单独的参数名,但你的数据字典里只有length (min)这个键,因此提示缺少length参数。 - 双引号会让SQLite把该位置当成字符串字面量,而非绑定参数,根本无法正确映射数据。
修复方案
方案1:正确处理带特殊字符的绑定参数
移除绑定参数的双引号,并用括号包裹带空格/特殊字符的参数名,让SQLAlchemy完整识别参数名:
def copy_videos(): create_table_videos() query1 = run_query("SELECT * FROM videos") with local_engine.connect() as conn: # 用括号包裹带特殊字符的参数名 query2 = text('INSERT INTO videos VALUES (:video_id, :title, :("length (min)"), :category_id, :created_at)') conn.execute(query2, query1) conn.commit() # 提交事务,确保数据写入 query = "SELECT * FROM videos" rows = conn.execute(text(query)) # 修正返回逻辑,原x['videos']不存在,返回整行或指定列 for x in rows.all(): return x print(copy_videos())
方案2:显式指定列名(更稳妥)
在INSERT语句中明确写出列名,既避免列顺序不一致的潜在问题,也让参数映射更清晰:
def copy_videos(): create_table_videos() query1 = run_query("SELECT * FROM videos") with local_engine.connect() as conn: # 显式指定列名,带空格的列用双引号包裹,参数名用括号标识 query2 = text('INSERT INTO videos (video_id, title, "length (min)", category_id, created_at) VALUES (:video_id, :title, :("length (min)"), :category_id, :created_at)') conn.execute(query2, query1) conn.commit() query = "SELECT * FROM videos" rows = conn.execute(text(query)) for x in rows.all(): return x print(copy_videos())
额外注意点
- 必须调用
conn.commit(),否则SQLite不会持久化插入的数据。 - 原代码中
return(x['videos'])逻辑错误,查询结果的键是列名(如video_id、length (min)),而非表别名videos,需修正为返回具体列或整行数据。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

