Ich löste ein ähnliches Problem heute - um eine Migration durchzuführen, ein neues Modell zu schaffen, sondern nur für eine Postgres DB - und ich diese Frage gefunden. Aber die Antwort von Matthew hat mir nicht geholfen. Tatsächlich bin ich mir nicht sicher, ob es überhaupt funktioniert. Das liegt daran, dass die Zeile mit migrations.RunSQL(...)
nicht tatsächlich ausführen SQL; es erstellt ein neues Objekt des Typs RunSQL
, die eine Command
ist, und dann sofort verworfen.
Hier ist, wie ich das Problem lösen endete, falls jemand für „django bedingte Migration“ in der Zukunft zu suchen versucht:
from __future__ import unicode_literals
import django.contrib.postgres.fields
from django.db import migrations, models
class PostgresOnlyCreateModel(migrations.CreateModel):
def database_forwards(self, app_label, schema_editor, from_state, to_state):
if schema_editor.connection.vendor.startswith("postgres"):
super(PostgresOnlyCreateModel, self).database_forwards(app_label, schema_editor, from_state, to_state)
def database_backwards(self, app_label, schema_editor, from_state, to_state):
if schema_editor.connection.vendor.startswith("postgres"):
super(PostgresOnlyCreateModel, self).database_backwards(app_label, schema_editor, from_state, to_state)
class Migration(migrations.Migration):
dependencies = [
...whatever...
]
operations = [
PostgresOnlyCreateModel(
name='...whatever...',
fields=[...whatever...],
),
]
Mein Herstellerzeichen war 'postgresql' und nicht' postgres' (in Django 1.10.6) –
Das Problem dabei ist, dass 'migrations.RunSQL()' ein Objekt zurückgibt. Es führt tatsächlich kein SQL aus, bis die Methode '_run_sql()' des Objekts mit bestimmten Parametern aufgerufen wird. Siehe die Antwort von PaulMest für eine Lösung, die ebenfalls die Methode 'migrations.RunPython()' verwendet, SQL jedoch so ausführt, dass SQL tatsächlich ausgeführt wird. – radicalbiscuit