欢迎来到海上华帆的博客园子

记录一些学习过程中的心得体会,供自己和有缘人参考!

Django项目修改模型后迁移遇到duplicate column name的解决办法

命令行操作实例

(venv) ➜  wms git:(v18) ✗ python baking_wms/manage.py migrate
Operations to perform:
  Apply all migrations: accounts, admin, auth, contenttypes, cost, delivery, equipment, inventory, material, procurement, production, quality, recipe, sales, sessions, store
Running migrations:
  Applying delivery.0002_deliveryorder_driver_deliveryorder_shipment_and_more...Traceback (most recent call last):
  File "/Users/liuyuhua/trae/wms/venv/lib/python3.11/site-packages/django/db/backends/utils.py", line 103, in _execute
    return self.cursor.execute(sql)
           ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/liuyuhua/trae/wms/venv/lib/python3.11/site-packages/django/db/backends/sqlite3/base.py", line 350, in execute
    return super().execute(query)
           ^^^^^^^^^^^^^^^^^^^^^^
sqlite3.OperationalError: duplicate column name: driver_id

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/Users/liuyuhua/trae/wms/baking_wms/manage.py", line 22, in <module>
    main()
  File "/Users/liuyuhua/trae/wms/baking_wms/manage.py", line 18, in main
    execute_from_command_line(sys.argv)
  File "/Users/liuyuhua/trae/wms/venv/lib/python3.11/site-packages/django/core/management/__init__.py", line 442, in execute_from_command_line
    utility.execute()
  File "/Users/liuyuhua/trae/wms/venv/lib/python3.11/site-packages/django/core/management/__init__.py", line 436, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/Users/liuyuhua/trae/wms/venv/lib/python3.11/site-packages/django/core/management/base.py", line 413, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/Users/liuyuhua/trae/wms/venv/lib/python3.11/site-packages/django/core/management/base.py", line 459, in execute
    output = self.handle(*args, **options)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/liuyuhua/trae/wms/venv/lib/python3.11/site-packages/django/core/management/base.py", line 107, in wrapper
    res = handle_func(*args, **kwargs)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/liuyuhua/trae/wms/venv/lib/python3.11/site-packages/django/core/management/commands/migrate.py", line 357, in handle
    post_migrate_state = executor.migrate(
                         ^^^^^^^^^^^^^^^^^
  File "/Users/liuyuhua/trae/wms/venv/lib/python3.11/site-packages/django/db/migrations/executor.py", line 135, in migrate
    state = self._migrate_all_forwards(
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/liuyuhua/trae/wms/venv/lib/python3.11/site-packages/django/db/migrations/executor.py", line 167, in _migrate_all_forwards
    state = self.apply_migration(
            ^^^^^^^^^^^^^^^^^^^^^
  File "/Users/liuyuhua/trae/wms/venv/lib/python3.11/site-packages/django/db/migrations/executor.py", line 255, in apply_migration
    state = migration.apply(state, schema_editor)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/liuyuhua/trae/wms/venv/lib/python3.11/site-packages/django/db/migrations/migration.py", line 132, in apply
    operation.database_forwards(
  File "/Users/liuyuhua/trae/wms/venv/lib/python3.11/site-packages/django/db/migrations/operations/fields.py", line 110, in database_forwards
    schema_editor.add_field(
  File "/Users/liuyuhua/trae/wms/venv/lib/python3.11/site-packages/django/db/backends/sqlite3/schema.py", line 318, in add_field
    super().add_field(model, field)
  File "/Users/liuyuhua/trae/wms/venv/lib/python3.11/site-packages/django/db/backends/base/schema.py", line 768, in add_field
    self.execute(sql, params or None)
  File "/Users/liuyuhua/trae/wms/venv/lib/python3.11/site-packages/django/db/backends/base/schema.py", line 202, in execute
    cursor.execute(sql, params)
  File "/Users/liuyuhua/trae/wms/venv/lib/python3.11/site-packages/django/db/backends/utils.py", line 122, in execute
    return super().execute(sql, params)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/liuyuhua/trae/wms/venv/lib/python3.11/site-packages/django/db/backends/utils.py", line 79, in execute
    return self._execute_with_wrappers(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/liuyuhua/trae/wms/venv/lib/python3.11/site-packages/django/db/backends/utils.py", line 92, in _execute_with_wrappers
    return executor(sql, params, many, context)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/liuyuhua/trae/wms/venv/lib/python3.11/site-packages/django/db/backends/utils.py", line 100, in _execute
    with self.db.wrap_database_errors:
  File "/Users/liuyuhua/trae/wms/venv/lib/python3.11/site-packages/django/db/utils.py", line 91, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "/Users/liuyuhua/trae/wms/venv/lib/python3.11/site-packages/django/db/backends/utils.py", line 103, in _execute
    return self.cursor.execute(sql)
           ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/liuyuhua/trae/wms/venv/lib/python3.11/site-packages/django/db/backends/sqlite3/base.py", line 350, in execute
    return super().execute(query)
           ^^^^^^^^^^^^^^^^^^^^^^
django.db.utils.OperationalError: duplicate column name: driver_id

(venv) ➜  wms git:(v18) ✗ python baking_wms/manage.py shell
Python 3.11.9 (v3.11.9:de54cf5be3, Apr  2 2024, 07:12:50) [Clang 13.0.0 (clang-1300.0.29.30)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> drop table delivery_deliveryorder;
  File "<console>", line 1
    drop table delivery_deliveryorder;
         ^^^^^
SyntaxError: invalid syntax
>>> DROP TABLE delivery_deliveryorder;
  File "<console>", line 1
    DROP TABLE delivery_deliveryorder;
         ^^^^^
SyntaxError: invalid syntax
>>> exit()
(venv) ➜  wms git:(v18) ✗ cd baking_wms
(venv) ➜  baking_wms git:(v18) ✗ sqlite3 db.sqlite3
SQLite version 3.43.2 2023-10-10 13:08:14
Enter ".help" for usage hints.
sqlite> drop table delivery_deliveryorder;
sqlite> .quit

主要问题

  1. duplicate column name错误提示
  2. 如何进入sqlite3数据库删除相应表格

解决方法及拓展

原因分析

因为数据库中已经存在与迁移文件中定义的列名相同的字段:原因是因为修改了模型,但之前已经在数据库创建了对应的表格,所以会造成列名相同的冲突

sqlite3的数据操作

sqlite3 baking_wms/db.sqlite3 进入
.tables 查看所有表格
sqlite> drop table delivery_deliveryorder; 删除表格
sqlite> drop table delivery_driver;
sqlite> drop table delivery_vehicle;
.quit 退出

删除应用下迁移目录中除了__init__.py外,其他所有文件,包括__pycache__文件夹及其内文件,还包括0001_initial.py迁移文件。

posted @ 2025-06-20 20:07  海上华帆  阅读(47)  评论(0)    收藏  举报