解决报错 Unknown column '*_image_url' in 'field list'

该报错直译为:数据库对应表格中没有 *_image_url 字段。

开门见山,解决方法

修改模型类字段 *_image_url 直接去掉 _url 即可。

问题重现:

模型类中定义了字段

 *_image_url = models.ImageField()

Pycharm中看到数据库中出现的字段为: *_image_url
使用模型类查询数据库时,报错:

django.db.utils.OperationalError: (1054, "Unknown column 'tb_sku.*_image_url' in 'field list'")

解决过程

1、查询数据库 tb_sku表格 的确有 *_image_url 字段,一字不差。
查询模型类,模型类字段名为 *_image_url,类型为 ImageField。

2、思考无果后,决定尝试修改字段名,去掉_url,重新迁移模型类。
创建迁移文件成功,迁移失败,报错:

pymysql.err.OperationalError: (1054, "Unknown column '*_image_url' in 'tb_sku'")
django.db.utils.OperationalError: (1054, "Unknown column '*_image_url' in 'tb_sku'")

3、再注释掉初始化迁移文件中的 *_image_url
创建迁移文件失败。报错:

pymysql.err.OperationalError:(1060, "Duplicate column name '*_image'")
django.db.utils.OperationalError: (1060, "Duplicate column name '*_image'")

4、结合上面两条报错,数据库中没有 *_image_url 字段,而 *_image 字段重复定义。说明我通过PyCharm看到的数据库字段 *_image_url 其真名为 *_image。
接着证明猜想,不在执着数据库迁移,直接确认已经将模型类的该字段改成了 *_image,再次重启服务,发送请求,成功响应!

5、总结:定义模型类字段不要以 _url 结尾,在数据库迁移时,这个尾巴会被直接忽略掉,在数据库中创建的真实字段名没有这个尾巴。即使你在PyCharm中看到了该字段有 _url,其实是欺骗眼睛的。

6、有意思的是,当我为了写这个博客,去重现问题时发现,但我注释掉初始化迁移文件中的_url字段,模型类中该字段保留_url时,数据库迁移竟然成功了。我再去查看数据库(PyCharm中),发现有值的是*_image,没有值的是 *_image_url。也就是说, 由于新添加了 *_image_url 字段的,原来的 *_image_url 被打回了原形 *_image。

posted @ 2021-08-03 13:27  流水自净  阅读(723)  评论(0)    收藏  举报