django.db.connection не поддерживает метод fileno () - PullRequest
0 голосов
/ 31 декабря 2018

У меня есть собственный метод в моем менеджере моделей, который позволяет мне прослушивать уведомления о модификациях в БД, используя postgreSQL.Короткая версия этого кода выглядит следующим образом:

def listen_for_notify(self):
        import select
        import psycopg2
        import psycopg2.extensions

        from django.conf import settings

        db_data = settings.DATABASES['default']
        listened = None
        returned_empty = None
        search_timeout = 15

        conn = psycopg2.connect(dbname=db_data['NAME'], user=db_data['USER'], password=db_data['PASSWORD'], host=db_data['HOST'], port=db_data['PORT'])
        conn.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT)
        curs = conn.cursor()
        curs.execute("LISTEN default;")     

        timeout = timezone.now() + timezone.timedelta(0, search_timeout)
        while timezone.now() < timeout:
            time_diff = timeout - timezone.now()
            if select.select([conn], [], [], float(time_diff.seconds)) == ([], [], []):
                listened = False
                timeout = timezone.now()
            else:
                conn.poll()
                while conn.notifies:
                    notify = conn.notifies.pop(0)
                    if notify.payload == "notified":
                        listened = True
                        returned_empty = False
                        timeout = timezone.now()
                    if notify.payload == 'search request returned empty':
                        listened = True
                        returned_empty = True
                        timeout = timezone.now()
        curs.close()
        conn.close()
        return listened, returned_empty

Было бы здорово, если бы вместо библиотеки psycopg2 я мог использовать только django.db.Примерно так:

def listen_for_notify(self):
        from django.db import connection as conn

        listened = None
        returned_empty = None
        search_timeout = 15

        with conn.cursor() as curs
            timeout = timezone.now() + timezone.timedelta(0, search_timeout)
            while timezone.now() < timeout:
                time_diff = timeout - timezone.now()
                if select.select([conn], [], [], float(time_diff.seconds)) == ([], [], []):
                    listened = False
                    timeout = timezone.now()
                else:
                    conn.poll()
                    while conn.notifies:
                        notify = conn.notifies.pop(0)
                        if notify.payload == "notified":
                            listened = True
                            returned_empty = False
                            timeout = timezone.now()
                        if notify.payload == 'search request returned empty':
                            listened = True
                            returned_empty = True
                            timeout = timezone.now()
        return listened, returned_empty

Я пробовал решение выше, используя django.db, но оно не работает, потому что у объекта django.db.connection нет метода fileno().

Это в настоящее время не поддерживается или я что-то упустил?Я думаю, что django.db это всего лишь оболочка для реальной библиотеки psycopg2.Поэтому я удивляюсь, почему я не могу использовать метод fileno().

...