La respuesta aceptada es correcta, pero si desea algo más que el comentario de EoghanM, lo siguiente funcionó para mí al COPIAR una tabla en CSV...
from sqlalchemy import sessionmaker, create_engine
eng = create_engine("postgresql://user:example@sqldat.com:5432/db")
ses = sessionmaker(bind=engine)
dbcopy_f = open('/tmp/some_table_copy.csv','wb')
copy_sql = 'COPY some_table TO STDOUT WITH CSV HEADER'
fake_conn = eng.raw_connection()
fake_cur = fake_conn.cursor()
fake_cur.copy_expert(copy_sql, dbcopy_f)
El sessionmaker no es necesario, pero si tiene la costumbre de crear el motor y la sesión al mismo tiempo, use raw_connection necesitará separarlos (a menos que haya alguna forma de acceder al motor a través del objeto de sesión que no conozco). La cadena sql proporcionada a copy_expert tampoco es la única forma de hacerlo, hay un copy_to básico función que puede usar con un subconjunto de los parámetros que podría pasar a un COPY normal Para consultar. El rendimiento general del comando me parece rápido, copiando una tabla de ~20000 filas.
https://initd.org/psycopg/docs/cursor.html#cursor.copy_tohttps://docs.sqlalchemy.org/en/latest/core/connections.html#sqlalchemy.engine.Engine.raw_connection