Ich bin mir des Cursor-Objekts in Django bewusst. Gibt es eine andere bevorzugte Möglichkeit zum Ausführen von Raw SQL in Migrationen? Ich möchte die Postgresql-Partitionierung für eine meiner Modelltabellen einführen. Die Partitionslogik besteht aus einer Reihe von Funktionen und Triggern, die bei der Einrichtung, die ich automatisieren möchte, zur Datenbank hinzugefügt werden müssen.Wie führe ich rohe SQL in einer Django-Migration aus
Antwort
One way:
Der beste Weg, dies zu tun, ich gefunden RunSQL mit:
Migrations enthält die RunSQL Klasse. Um dies zu tun:
./manage.py makemigrations --empty myApp
- bearbeitet die erstellt Migrationen Datei enthalten sein:
operations = [ migrations.RunSQL('RAW SQL CODE') ]
Als Nathaniel Ritter erwähnt, RunSQL
akzeptiert auch einen reverse_sql
Parameter für die Migration rückgängig zu machen. See the docs for details
Ein anderer Weg
Die Art, wie ich mein Problem zunächst gelöst wurde das post_migrate
Signal mit einem Cursor nennen meine rohen SQL auszuführen.
Was ich meine App hinzuzufügen hatte, war dies:
im __init__.py
von myApp hinzufügen:
default_app_config = 'myApp.apps.MyAppConfig'
Erstellen Sie eine Datei apps.py
:
from django.apps import AppConfig
from django.db.models.signals import post_migrate
from myApp.db_partition_triggers import create_partition_triggers
class MyAppConfig(AppConfig):
name = 'myApp'
verbose_name = "My App"
def ready(self):
post_migrate.connect(create_partition_triggers, sender=self)
Neue Datei db_partition_triggers.py
:
from django.db import connection
def create_partition_triggers(**kwargs):
print ' (re)creating partition triggers for myApp...'
trigger_sql = "CREATE OR REPLACE FUNCTION...; IF NOT EXISTS(...) CREATE TRIGGER..."
cursor = connection.cursor()
cursor.execute(trigger_sql)
print ' Done creating partition triggers.'
Nun wird auf jeder manage.py syncdb
oder manage.py migrate
diese Funktion aufgerufen. Stellen Sie also sicher, dass CREATE OR REPLACE
und IF NOT EXISTS
verwendet werden. So kann es mit bestehenden Funktionen umgehen.
- 1. Wie führe ich rohe Abfragen mit Laravel 5.1 aus?
- 2. Wie führe ich ein Skript mit einer BAT-Datei aus?
- 3. Wie führe ich T-SQL von C# aus?
- 4. Subsonic 3.0 Simplerepository: Wie führe ich plain sql (CTE) aus?
- 5. Wie führe ich diese LOAD XML INFILE SQL Abfrage aus?
- 6. Wie führe ich TopoJSON aus?
- 7. Wie führe ich Python inline aus einer Bash-Shell aus?
- 8. Wie führe ich meine .sql-Skriptdatei über ADO.NET aus?
- 9. Wie führe ich jeden Befehl in einer Liste aus?
- 10. Wie führe ich eine Methode in einer MVC-Anwendung aus?
- 11. Wie führe ich den in einer Variablen gespeicherten Befehl aus?
- 12. Wie führe ich alle Projekte in einer Projektgruppe aus?
- 13. Wie führe ich mehrere Python-Testfälle in einer Schleife aus?
- 14. Wie führe ich Cypher in einer Datei aus?
- 15. Wie führe ich Zeichenketten in Java aus?
- 16. Wie führe ich findAndModify in Restheart aus?
- 17. Wie führe ich Bitoperationen in glsl aus?
- 18. Wie führe ich page.render in page.evaluate aus?
- 19. Wie führe ich SQL Stored Procedures aus einer anderen Stored Procedure aus?
- 20. Wie führe ich willkürliche SQL auf DBeaver?
- 21. Wie führe ich eine Zeilensperre aus?
- 22. SQL Server: Wie führe ich 2 Select-Anweisungen in einer einzigen Abfrage aus
- 23. Wie führe ich eine Abfrage wie diese aus?
- 24. Wie führe ich Dalvik Op-Codes aus?
- 25. Wie führe ich die Hauptmethode einer Android-Aktivitätsklasse aus?
- 26. Wie führe ich Valgrind mit einer Android App aus?
- 27. Wie führe ich die Funktion innerhalb einer Klasse aus? Javascript
- 28. Wie führe ich eine gespeicherte Prozedur aus Preparestatement aus
- 29. Wie führe ich eine Select-Anweisung in C# aus einer Access-Datenbank mit einer Variablen aus?
- 30. Führe zwei Funktionen in einer Variablen aus
Gibt es eine Möglichkeit, Rückwärtsmigration für Suctom SQL hinzuzufügen? – DataGreed
Sie sollten Ihre Notiz über RunSQL wirklich nach oben verschieben. Es ist absolut der beste Weg, dies zu tun ... –
@DataGreed Nicht sicher, ob Sie immer noch wissen möchten, aber Sie können eine zweite SQL-Zeichenfolge übergeben, um als die umgekehrte SQL verwendet werden. – LarrikJ