记一次Django数据库迁移报错Table 'xxxxx' doesn't exist

376 阅读1分钟

起因

需求是将当前Django项目的数据库迁移到另外一个数据库实例中,采用的方案是将当前使用的数据库通过Navicat的导出功能,导出数据库中的每个表的建表sql和具体数据插入的sql并生成对应的sql文件。

问题

在Navicat中的新的数据连接中执行sql文件,导入数据成功,修改Django项目中的数据库连接地址,验证Django项目功能,发现调用接口时项目报错,提示Table 'xxxxx' doesn't exist

问题排查

对比Django项目中的model的名称发现,Django项目中的表名都是以驼峰方式命名,而数据库中的表名全部都是小写,查看之前数据库中表的名称也都是小写,尝试修改新数据库中的表的名称改为与Django项目中一致,发现改后可以正常访问,所以确认问题原因由表的名称大小写不一致导致,但是此时未查明为什么之前的数据库中表名为全小写时为何功能正常。

问题原因

查阅mysql相关资料发现,mysql中存在一项配置lower_case_table_names,该配置的值为1时,mysql忽略大小写,默认值为0,之前的数据库能正常访问的原因是存在该配置且配置的值为1,新的数据库连接中无此配置,所以迁移后会报错Table 'xxxxx' doesn't exis