複雑なプロジェクトを sqlite から PostgreSQL に移行する必要があります。多くの人が外部キー、データの切り捨てなどに問題を抱えているようです...
- 完全に自動化されたユーティリティはありますか?
- 移行前にデータやスキーマを確認する必要がありますか?
編集: django-command-extensions DumpScriptを試しましたが、現在の DataSet を使用する 2GB RAM PC では実行されません。
複雑なプロジェクトを sqlite から PostgreSQL に移行する必要があります。多くの人が外部キー、データの切り捨てなどに問題を抱えているようです...
編集: django-command-extensions DumpScriptを試しましたが、現在の DataSet を使用する 2GB RAM PC では実行されません。
私はそれをする必要はありませんでしたが、私が試みることは.
@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': '',
}
}
これを行う別の方法は、複数のデータベースを使用することです。
http://docs.djangoproject.com/en/dev/topics/db/multi-db/
このセクションを読むことが重要です。
私が理解していることから、新しいDBにデータがない場合、たとえばフィクスチャから実行できることを意味します
queryset = MyModel.objects.using("old-db").all()
for obj in queryset:
obj.save(using="new-db")
それは主キーを保持するはずなので、外部キーの問題はないと思います。
まず最初に、簡単なことを試してみます。
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 テーブルと同じであることを確認してください。