web-dev-qa-db-ja.com

Django DBをSQLiteからMySQLに移行する最良の方法は何ですか?

私はdbをsqliteからmysqlに移行する必要があります。そこにあるさまざまなツール/スクリプトは多すぎて、最も安全で最もエレガントなソリューションを簡単に見つけることができません。

これはニース http://djangosnippets.org/snippets/14/ のように思えましたが、心配なアップデートを取得してから3年になるようです。

Django 1.1.1で信頼できることがわかっているソリューションを推奨できますか?

44
GJ.

実行:

python manage.py dumpdata > datadump.json

次に、settings.pyをmysqlデータベースに変更します。

最終的に:

python manage.py loaddata datadump.json
78
Martin Eve

いくつかのハード検索の後、私はいくつかの問題を抱えていました。

私の式は

  1. _python manage.py dumpdata > datadump.json_
  2. Mysqlにsettings.pyを変更します
  3. MySQLに接続できることを確認します(権限など)
  4. _python manage.py migrate --run-syncdb_
  5. シェルでこのスニペットを使用してcontentypeデータを除外する

    _python manage.py Shell_

    from Django.contrib.contenttypes.models import ContentType ContentType.objects.all().delete() quit()

  6. _python manage.py loaddata datadump.json_

お役に立てれば幸いです。

47

これは、他の場所で説明されているContentType問題を回避するためのより適切な方法です。

./manage.py dumpdata --exclude contenttypes --exclude auth.permission --exclude sessions --indent 2 > dump.json

次に:

./manage.py loaddata dump.json
4

SqliteからMySQL、YMMVに移行するために必要な手順の(より詳しい)リスト:

  1. python manage.py dumpdata> datadump.json
  2. MySQLに接続できることを確認します(権限など)
  3. FOREIGN_KEY_CHECKSを変更する権限を持っていることを確認してください(そのためには、mysqlの独自のプライベートインスタンスをインストールして実行する必要がありました)。
  4. InnoDBエンジンが使用されていないことを確認してください(MyISAMをeveryテーブルで使用してください)。
  5. 次のコマンドで検証を緩和します(これはInnoDBでは有効になりません):_SET GLOBAL FOREIGN_KEY_CHECKS = 0;_
  6. Django_site.sqlテーブルを個別にロードします(contrib.sitesを使用している場合)
  7. Settings.pyを新しいmysqlに変更します
  8. python manage.py migrate --run-syncdb
  9. 必要に応じて、DjangoアプリとDBテーブルの/ migrationsディレクトリにあるコードをいじって、syncdbエラーを修正します。
  10. このスニペットでコンテンツタイプのデータを除外します(メインのurls.pyモジュールに配置できます):_from Django.contrib.contenttypes.models import ContentType_ ContentType.objects.all().delete()quit()
  11. Jsonデータを編集する必要がある場合は、最初にそれをきれいにする必要があります:_cat datadump.json | python -m json.tool > datadump_pretty.json_
  12. python manage.py loaddata datadump.json
  13. データの切り捨ての問題を修正する
  14. タイムゾーンデータをデータベースに追加します:_mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -D mysql -P 1234 -u root -p --protocol=tcp_ _mysql -P 1234 -u root -p -e "flush tables" --protocol=tcp_
  15. データを送信せずにサイトが機能していることをテストする
  16. SET GLOBAL FOREIGN_KEY_CHECKS = 1;
  17. 残りをテストする
1
Alexei Yur