30

複雑なプロジェクトを sqlite から PostgreSQL に移行する必要があります。多くの人が外部キー、データの切り捨てなどに問題を抱えているようです...

  • 完全に自動化されたユーティリティはありますか?
  • 移行前にデータやスキーマを確認する必要がありますか?

編集: django-command-extensions DumpScriptを試しましたが、現在の DataSet を使用する 2GB RAM PC では実行されません。

4

7 に答える 7

9

私はそれをする必要はありませんでしたが、私が試みることは.

  1. 実行中のサーバーを停止する
  2. python manage.py ダンプデータ
  3. 新しく作成された postgres データベースを指すように settings.py を変更します。
  4. python manage.py ロードデータ
于 2010-08-13T13:08:10.457 に答える
6

@Nimo の回答によると、 from を使用すると、 Django 1.9"syncdb"以降では機能しません( Django 1.7で機能します) 。

代わりに、次のコマンドを使用します。

python manage.py migrate


そして、これがPostgresの設定構成です:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'myproject',
        'USER': 'myprojectuser',
        'PASSWORD': 'password',
        'HOST': 'localhost',
        'PORT': '',
    }
}
于 2018-02-21T13:22:04.867 に答える
4

これを行う別の方法は、複数のデータベースを使用することです。

http://docs.djangoproject.com/en/dev/topics/db/multi-db/

このセクションを読むことが重要です。

http://docs.djangoproject.com/en/dev/topics/db/multi-db/#moving-an-object-from-one-database-to-another

私が理解していることから、新しいDBにデータがない場合、たとえばフィクスチャから実行できることを意味します

queryset = MyModel.objects.using("old-db").all()
for obj in queryset:
    obj.save(using="new-db")

それは主キーを保持するはずなので、外部キーの問題はないと思います。

于 2010-08-19T13:15:05.717 に答える
2

まず最初に、簡単なことを試してみます。

sqlite3 sqllitedb .dump | psql postgresdb

その時点で、それをテストしてください。Django でいくつかのテスト スクリプトを作成して、各アプリケーションのサンプル レコードのセットを出力し、diff を実行してそれらが同一であることを確認します。そうであれば、変換はおそらく問題ありません。

それがうまくいかない場合...

Django を使用してデータをダンプおよびロードすることはお勧めしません。最適化されていないと思うからです。

代わりに、正しい PostgreSQL データベース設定でアプリの 2 番目のバージョンを作成し、syncdb を実行してすべてのテーブルを作成してから、他のツールを使用して mysqllite から PostgreSQL にデータをコピーします。

問題は、データを変換するときの問題のほとんどがテーブル定義などにあるということです。それらは最も特異なようです。テーブルの内容だけをダンプした SQL スクリプトを生成できれば、それはかなり標準的な SQLINSERT INTOコマンドになります。

正直なところ、なぜ外部キーの問題が発生するのかわかりません。sqlite が正確な外部キーを作成していると仮定すると (なぜ作成しないのでしょうか?)、正しくコピーしない方法はありません。実際、外部キーは特別な形式のデータではありません。UserProfile.user_idフィールドに正しくない値が含まれる可能性は、フィールドに含まれる可能性よりも高くありませんUserProfile.photo。外部キーの問題が、フィールド自体が外部キー フィールドとして正しく識別されない (つまり、制約がない) ことである場合、最初に を使用してデータベースを作成するというオプションがsyncdbその問題に対処します。

切り捨てによる:私が理解しているように、データが切り捨てられようとしている場合、PostgreSQLはハードエラーをスローします。それがsqliteの場合なのか、それとも単に切り捨てられるのかはわかりません。いずれにせよ、再び sqlite がエクスポート時に何らかの方法でデータを変更していないと仮定すると、フィールドには、それが入るフィールドに適切な長さのデータが含まれている必要があります。少なくともインポート中は、PostgreSQL フィールドのエンコーディングが sqlite テーブルと同じであることを確認してください。

于 2010-08-13T15:00:39.937 に答える