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

