Ich versuche, (mit COPY) eine große Datei von s3 nach Redshift zu schieben. Ich benutze Sqlalchemy in Python, um den SQL-Befehl auszuführen, aber es sieht aus, dass die Kopie nur funktioniert, wenn ich vorläufig die Tabelle TRUNCATE.COPY Daten von S3 zu RedShift in Python (sqlalchemy)
die Verbindung funktioniert ok:
from sqlalchemy import create_engine
engine = create_engine('postgresql://XXXX:[email protected]:XXXX/XXXX')
mit dieser Befehlsfolge (wenn ich die Tabelle vor dem COPY-Befehl truncate)
toRedshift = "TRUNCATE TABLE public.my_table; COPY public.my_table from 's3://XXXX/part-p.csv' CREDENTIALS 'aws_access_key_id=AAAAAAA;aws_secret_access_key=BBBBBBB' gzip removequotes IGNOREHEADER 0 delimiter '|';"
engine.execute(toRedshift)
Wenn ich die entfernen "TRUNCATE TABLE public.my_table;" Bit
toRedshift = "COPY public.my_table from 's3://XXXX/part-p.csv' CREDENTIALS 'aws_access_key_id=AAAAAAA;aws_secret_access_key=BBBBBBB' gzip removequotes IGNOREHEADER 0 delimiter '|';"
engine.execute(toRedshift)
Aber der Befehl funktioniert perfekt mit jedem anderen SQL-Client (wie DBeaver zum Beispiel)
Ziemlich sicher, dass dies kommt auf [wie autocommit Werke] (http://docs.sqlalchemy.org/en/latest/core/connections.html#understanding-autocommit), aber noch nicht sicher, wie oder wenn überhaupt. Weder TRUNCATE noch COPY sind im AUTOCOMMIT_REGEXP-Muster aufgeführt. Versuchen Sie, Ihre ''COPY ...' 'Anweisung in ein' text (stmt) .execution_options (autocommit = True) 'Konstrukt zu schreiben und übergeben Sie dieses an' engine.execute() '. –
engine.execute (text (stmt). Execution_options (autocommit = True)) – user3620915