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

如何使用带空格的列名向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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 06:10:32