Redshift COPY operation doesn't work in SQLAlchemy

后端 未结 3 733
隐瞒了意图╮
隐瞒了意图╮ 2021-01-17 19:18

I\'m trying to do a Redshift COPY in SQLAlchemy.

The following SQL correctly copies objects from my S3 bucket into my Redshift table when I execute it in psql:

3条回答
  •  隐瞒了意图╮
    2021-01-17 20:05

    I basically had the same problem, though in my case it was more:

    engine = create_engine('...')
    engine.execute(text("COPY posts FROM 's3://mybucket/the/key/prefix' WITH CREDENTIALS aws_access_key_id=myaccesskey;aws_secret_access_key=mysecretaccesskey'    JSON AS 'auto';"))
    

    By stepping through pdb, the problem was obviously the lack of a .commit() being invoked. I don't know why session.commit() is not working in your case (maybe the session "lost track" of the sent commands?) so it might not actually fix your problem.

    Anyhow, as explained in the sqlalchemy docs

    Given this requirement, SQLAlchemy implements its own “autocommit” feature which works completely consistently across all backends. This is achieved by detecting statements which represent data-changing operations, i.e. INSERT, UPDATE, DELETE [...] If the statement is a text-only statement and the flag is not set, a regular expression is used to detect INSERT, UPDATE, DELETE, as well as a variety of other commands for a particular backend.

    So, there are 2 solutions, either:

    • text("COPY posts FROM 's3://mybucket/the/key/prefix' WITH CREDENTIALS aws_access_key_id=myaccesskey;aws_secret_access_key=mysecretaccesskey' JSON AS 'auto';").execution_options(autocommit=True).
    • Or, get a fixed version of the redshift dialect... I just opened a PR about it

提交回复
热议问题