1. 程式人生 > 實用技巧 >django 遷移 與 精準遷移 與 二次遷移 migrations 以及錯誤處理

django 遷移 與 精準遷移 與 二次遷移 migrations 以及錯誤處理

首先資料庫遷移的兩大命令:

  python manage.py makemigrations & python manage.py migrate

前者是將model層轉為遷移檔案migration,後者將新版本的遷移檔案執行,更新資料庫。

這兩中命令呼叫預設為全域性,即對所有最新更改的model或遷移檔案進行操作。如果想對部分app進行操作,就要在其後追加app name:

  $ python manage.py makemigrations app_name   $ python manage.py migrate app_name

如果想要精確到某個遷移檔案(0004_xxx.py):

  $ python manage.py migrate app_name 0004

如果想看遷移檔案的執行狀態,可以用showmigrations命令檢視:

  $ python manage.py showmigrations   admin   [X] 0001_initial   auth   [X] 0001_initial   [X] 0002_alter_permission_name_max_length

  

#評論 關聯OrderGoods 反查所有評論
  orders = sku_data.ordergoods_set.all()

關聯時提示沒有 ordergoods_set 報錯

之前遷移資料庫時 不知怎麼地 orders模組的沒有遷移 資料庫沒有 df_order_info 與 df_order_goods 表 然後又重新執行了 python manage.py makemigrations python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, goods, orders, sessions, users
Running migrations:
  Applying goods.0001_initial...Traceback (most recent call last):
  File 
"/home/czpubuntu/.virtualenvs/django_py3/lib/python3.6/site-packages/django/db/backends/utils.py", line 63, in execute return self.cursor.execute(sql) File "/home/czpubuntu/.virtualenvs/django_py3/lib/python3.6/site-packages/django/db/backends/mysql/base.py", line 101, in execute return self.cursor.execute(query, args) File "/home/czpubuntu/.virtualenvs/django_py3/lib/python3.6/site-packages/pymysql/cursors.py", line 170, in execute result = self._query(query) File "/home/czpubuntu/.virtualenvs/django_py3/lib/python3.6/site-packages/pymysql/cursors.py", line 328, in _query conn.query(q) File "/home/czpubuntu/.virtualenvs/django_py3/lib/python3.6/site-packages/pymysql/connections.py", line 517, in query self._affected_rows = self._read_query_result(unbuffered=unbuffered) File "/home/czpubuntu/.virtualenvs/django_py3/lib/python3.6/site-packages/pymysql/connections.py", line 732, in _read_query_result result.read() File "/home/czpubuntu/.virtualenvs/django_py3/lib/python3.6/site-packages/pymysql/connections.py", line 1075, in read first_packet = self.connection._read_packet() File "/home/czpubuntu/.virtualenvs/django_py3/lib/python3.6/site-packages/pymysql/connections.py", line 684, in _read_packet packet.check_error() File "/home/czpubuntu/.virtualenvs/django_py3/lib/python3.6/site-packages/pymysql/protocol.py", line 220, in check_error err.raise_mysql_exception(self._data) File "/home/czpubuntu/.virtualenvs/django_py3/lib/python3.6/site-packages/pymysql/err.py", line 109, in raise_mysql_exception raise errorclass(errno, errval) pymysql.err.InternalError: (1050, "Table 'df_goods' already exists") The above exception was the direct cause of the following exception: Traceback (most recent call last): File "../../manage.py", line 22, in <module> execute_from_command_line(sys.argv) File "/home/czpubuntu/.virtualenvs/django_py3/lib/python3.6/site-packages/django/core/management/__init__.py", line 363, in execute_from_command_line utility.execute() File "/home/czpubuntu/.virtualenvs/django_py3/lib/python3.6/site-packages/django/core/management/__init__.py", line 355, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "/home/czpubuntu/.virtualenvs/django_py3/lib/python3.6/site-packages/django/core/management/base.py", line 283, in run_from_argv self.execute(*args, **cmd_options) File "/home/czpubuntu/.virtualenvs/django_py3/lib/python3.6/site-packages/django/core/management/base.py", line 330, in execute output = self.handle(*args, **options) File "/home/czpubuntu/.virtualenvs/django_py3/lib/python3.6/site-packages/django/core/management/commands/migrate.py", line 204, in handle fake_initial=fake_initial, File "/home/czpubuntu/.virtualenvs/django_py3/lib/python3.6/site-packages/django/db/migrations/executor.py", line 115, in migrate state = self._migrate_all_forwards(state, plan, full_plan, fake=fake, fake_initial=fake_initial) File "/home/czpubuntu/.virtualenvs/django_py3/lib/python3.6/site-packages/django/db/migrations/executor.py", line 145, in _migrate_all_forwards state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial) File "/home/czpubuntu/.virtualenvs/django_py3/lib/python3.6/site-packages/django/db/migrations/executor.py", line 244, in apply_migration state = migration.apply(state, schema_editor) File "/home/czpubuntu/.virtualenvs/django_py3/lib/python3.6/site-packages/django/db/migrations/migration.py", line 129, in apply operation.database_forwards(self.app_label, schema_editor, old_state, project_state) File "/home/czpubuntu/.virtualenvs/django_py3/lib/python3.6/site-packages/django/db/migrations/operations/models.py", line 97, in database_forwards schema_editor.create_model(model) File "/home/czpubuntu/.virtualenvs/django_py3/lib/python3.6/site-packages/django/db/backends/base/schema.py", line 302, in create_model self.execute(sql, params or None) File "/home/czpubuntu/.virtualenvs/django_py3/lib/python3.6/site-packages/django/db/backends/base/schema.py", line 119, in execute cursor.execute(sql, params) File "/home/czpubuntu/.virtualenvs/django_py3/lib/python3.6/site-packages/django/db/backends/utils.py", line 80, in execute return super(CursorDebugWrapper, self).execute(sql, params) File "/home/czpubuntu/.virtualenvs/django_py3/lib/python3.6/site-packages/django/db/backends/utils.py", line 65, in execute return self.cursor.execute(sql, params) File "/home/czpubuntu/.virtualenvs/django_py3/lib/python3.6/site-packages/django/db/utils.py", line 94, in __exit__ six.reraise(dj_exc_type, dj_exc_value, traceback) File "/home/czpubuntu/.virtualenvs/django_py3/lib/python3.6/site-packages/django/utils/six.py", line 685, in reraise raise value.with_traceback(tb) File "/home/czpubuntu/.virtualenvs/django_py3/lib/python3.6/site-packages/django/db/backends/utils.py", line 63, in execute return self.cursor.execute(sql) File "/home/czpubuntu/.virtualenvs/django_py3/lib/python3.6/site-packages/django/db/backends/mysql/base.py", line 101, in execute return self.cursor.execute(query, args) File "/home/czpubuntu/.virtualenvs/django_py3/lib/python3.6/site-packages/pymysql/cursors.py", line 170, in execute result = self._query(query) File "/home/czpubuntu/.virtualenvs/django_py3/lib/python3.6/site-packages/pymysql/cursors.py", line 328, in _query conn.query(q) File "/home/czpubuntu/.virtualenvs/django_py3/lib/python3.6/site-packages/pymysql/connections.py", line 517, in query self._affected_rows = self._read_query_result(unbuffered=unbuffered) File "/home/czpubuntu/.virtualenvs/django_py3/lib/python3.6/site-packages/pymysql/connections.py", line 732, in _read_query_result result.read() File "/home/czpubuntu/.virtualenvs/django_py3/lib/python3.6/site-packages/pymysql/connections.py", line 1075, in read first_packet = self.connection._read_packet() File "/home/czpubuntu/.virtualenvs/django_py3/lib/python3.6/site-packages/pymysql/connections.py", line 684, in _read_packet packet.check_error() File "/home/czpubuntu/.virtualenvs/django_py3/lib/python3.6/site-packages/pymysql/protocol.py", line 220, in check_error err.raise_mysql_exception(self._data) File "/home/czpubuntu/.virtualenvs/django_py3/lib/python3.6/site-packages/pymysql/err.py", line 109, in raise_mysql_exception raise errorclass(errno, errval) django.db.utils.InternalError: (1050, "Table 'df_goods' already exists")

報錯 網上搜了 一些方法:

檢視遷移內容 python manage.py showmigrations

執行

python manage.py migrate --fake

再次檢視 成這樣了

python manage.py showmigrations

能正常使用 之前沒有出現這樣的問題

沒有完全採用 留一個參考:https://blog.csdn.net/weixin_44575037/article/details/109078101

在後來又出現了這個問題

找了許久 提示意思是

表 df_order_goods 裡沒有 sku_id 欄位
django.db.utils.InternalError: (1054, "Unknown column 'df_order_goods.sku_id' in 'field list'")

之前 遷移資料庫 好像有這個欄位 可能是由於上面遷移的BUG 導致的

解決辦法:

  手動新增

    alter table df_order_goods add sku_id int not null;

有好的方法還請留言...............................

如果在有問題在解決吧!