psycopg2 copy_from soulève une exception ProgrammingError asynchrone avec une connexion de synchronisation dans la tâche céleri

asynchronous celery psycopg2 python sqlbulkcopy

Question

Mon problème est que je suis confronté

ProgrammingError: copy_from ne peut pas être utilisé avec un rappel asynchrone.

en essayant de copy_from sans connexion asynchrone. Cela doit être précisé, je crée une connexion à partir d'une tâche de céleri. Quelqu'un peut-il me donner une idée de la façon dont sqlalchemy ou le céleri ou quoi que ce soit qui force ma connexion psycopg2 à se comporter de manière async

conn = psycopg2.connect(con_string)
conn.async
>>0
cur = conn.cursor()    
data = BytesIO()
data.write('\n'.join(['Tom\tJenkins\t37',
                  'Madonna\t\N\t45',
                  'Federico\tDi Gregorio\t\N']))
data.seek(0)
curs.copy_from(data, 'test_copy')

Réponse populaire

Nous étions confrontés à cette erreur dans pgcli; dans ce cas, il est apparu qu'un wait_callback faisait en sorte que la connexion se comporte comme si elle était asynchrone du point de vue de psycopg2. Cela a aidé:

from contextlib import contextmanager

@contextmanager
def _paused_thread():
    try:
        thread = psycopg2.extensions.get_wait_callback()
        psycopg2.extensions.set_wait_callback(None)
        yield
    finally:
        psycopg2.extensions.set_wait_callback(thread)

with _paused_thread():
    cursor.copy_expert('copy mytable to STDOUT', file)


Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi