migrations.RunSQL
Djangoマイグレーションを使用して任意のSQLコードを実行しようとしています。私は、特定のdbバックエンド(例えばpostgresのみ)に対してこの移行を実行したいと思います。Django Migration RunSQL条件付きデータベースタイプ
私はto use something like thisと思っていますが、Migration
クラスのDB接続情報は表示されません。
migrations.RunSQL
Djangoマイグレーションを使用して任意のSQLコードを実行しようとしています。私は、特定のdbバックエンド(例えばpostgresのみ)に対してこの移行を実行したいと思います。Django Migration RunSQL条件付きデータベースタイプ
私はto use something like thisと思っていますが、Migration
クラスのDB接続情報は表示されません。
この情報は、Migrationクラスでは提供されていません。RunPython操作に渡されるschema_editor
属性で提供されています。これを使用する例については、the documentationを参照してください。
私はまさに同じ必要性を持っていました。 postgresでは動作するが、sqliteでは動作しないシーケンスの初期値を設定する移行を編集しなければならなかった。 Danielがリンクしているドキュメントに従ってRunPythonの中でRunSQLをラップする方法は次のとおりです。
from django.db import migrations
def forwards(apps, schema_editor):
if not schema_editor.connection.vendor == 'postgres':
return
migrations.RunSQL(
"alter sequence api_consumer_id_seq restart with 1000500;")
class Migration(migrations.Migration):
dependencies = [
('api', '0043_auto_20160416_2313'),
]
operations = [
migrations.RunPython(forwards),
]
今日は同様の問題を解決 - だけPostgresのDBのため、新しいモデルを作成するために、移行を実行するために必要 - と、私はこの質問を見つけました。しかし、マタイの答えは私を助けませんでした。実際、私はそれがまったく機能しているかどうかはわかりません。これは、migrations.RunSQL(...)
の行が実際にはを実行しないためです。 SQL; Command
のタイプRunSQL
の新しいオブジェクトを作成し、すぐに破棄します。ここで
私はRunSQL
を得ることができなかったので、私はこの問題を解決する方法である:ここでは
は、私は誰もが将来的に「条件付きの移行をジャンゴ」を検索しようとする場合には、問題を解決することになった方法です内部で働くことRunPython
。ありがたいことに、schema_editor
オブジェクトにはexecute()
methodがあります。
def forwards(apps, schema_editor):
if not schema_editor.connection.vendor.startswith('postgres'):
logger.info('Database vendor: {}'.format(schema_editor.connection.vendor))
logger.info('Skipping migration without attempting to ADD CONSTRAINT')
return
schema_editor.execute('ALTER TABLE my_table ADD CONSTRAINT my_constraint (my_field != \'NaN\';)')
def backwards(apps, schema_editor):
if not schema_editor.connection.vendor.startswith('postgres'):
logger.info('Database vendor: {}'.format(schema_editor.connection.vendor))
logger.info('Skipping migration without attempting to DROP CONSTRAINT')
return
schema_editor.execute('ALTER TABLE my_table DROP CONSTRAINT my_constraint;')
class Migration(migrations.Migration):
dependencies = [
...
]
operations = [
migrations.RunPython(forwards, backwards, atomic=True)
]
マイベンダー文字列が 'postgresql'としない(ジャンゴ1.10.6で)' postgres' –
たこれに伴う問題は 'migrations.RunSQLは()'オブジェクトを返すことです。そのオブジェクトの '_run_sql()'メソッドが特定のパラメータで呼び出されるまで、実際にはSQLを実行しません。 'migrations.RunPython()'メソッドも使用するが、実際にSQLを実行する方法でSQLを実行するソリューションのPaulMestの回答を参照してください。 – radicalbiscuit