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

Django用pandas导入Excel到SQLite报错no such column: dashboard_book.id

问题根源

你触发错误的核心原因是to_sql的if_exists='replace'参数会直接删除原有的dashboard_book表,再按照当前DataFrame的结构重建新表,完全覆盖了Django迁移生成的表结构:

  • Django迁移生成的表默认带id自增主键列、title列
  • 你的DataFrame只有title单列,设置index=True后生成的新表只有index、title两列,原id列直接消失,Django ORM查询时默认要读id列自然报错。

解决方案1:优先使用Django ORM写入(最稳妥,不会破坏表结构)

这种方式完全适配Django的模型规则,避免直接操作数据库带来的结构冲突,后续拓展功能也更兼容。
代码示例:

import pandas as pd
from dashboard.models import Book
from django.conf import settings

# 读取Excel
data_table = pd.read_excel(settings.IMPORT_DIRECTORY + "/book_table.xlsx")
# 批量构造模型对象
bulk_list = [Book(title=row['title']) for _, row in data_table.iterrows()]
# 批量插入,效率远高于逐行save
Book.objects.bulk_create(bulk_list)

解决方案2:如果一定要用pandas to_sql写入,调整参数适配Django表结构

修改to_sql的相关参数,不要删除原表,且保证列匹配:

import pandas as pd
from sqlalchemy import create_engine
from dashboard.models import Book

# 注意修正你原有的连接字符串,缺少一个斜杠
engine = create_engine('sqlite:///db.sqlite3')
data_table = pd.read_excel(settings.import_directory + "/book_table.xlsx")

# 如果需要清空旧数据,用ORM清空,不要用replace删表
Book.objects.all().delete()

# 参数调整说明:
# 1. if_exists改成'append',仅追加数据不修改表结构
# 2. index=False,不要写入pandas的默认索引列,避免和Django的id列冲突
data_table[['title']].to_sql(
    name="dashboard_book", 
    con=engine, 
    if_exists='append', 
    index=False
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 03:15:03