Der psycopg2
Treiber copy_to
und copy_from
Verfahren aussetzt, die verwendet werden können, das gleiche Verhalten wie der psql
Client zu implementieren; Der Schlüssel ist, die RunPython
Operation anstelle der RunSQL
Operation zu verwenden.
Sie benötigen:
- Eine Funktion in der Migration Ihre Datei zu öffnen und die Interaktion mit den Kopiermethoden
- A
RunPython
Betrieb in Ihrem Migrations operations
Liste die Funktion
aufzurufen
Beispiel mit Django 1.8.4, Python 2.7.10, psycopg2 2.6.1 -
from django.db import models, migrations
def forwards(apps, schema_editor):
with open('./path/to/file.csv', 'r') as infile:
with schema_editor.connection.cursor() as stmt:
#for finer control, use copy_expert instead
stmt.copy_from(infile, 'your_table', sep=',')
class Migration(migrations.Migration):
dependencies = [
]
operations = [
#this runs your function
migrations.RunPython(forwards)
]
Einige Anmerkungen:
- Das
file
Objekt copy
geben wird, ist im Wesentlichen STDIN
in der Erklärung.
- Der Kopierbefehl kann bei Spalten wählerisch sein; mit
copy_expert
Sie alle die gleichen Optionen wie der Befehl steuern: Format, Header-Trennzeichen usw.
Für weitere Informationen über die copy_*
Methoden, überprüfen Sie die psycopg2 docs: http://initd.org/psycopg/docs/cursor.html
Sicherlich ist dies nicht STDIN , ist es? Warum verwenden Sie keine INSERT-Anweisung? –
@DanielRoseman funktioniert es mit 'psql -f myfile.sql'. Beide Anwendungen sehen einem Neuling sehr ähnlich. – guettli