У меня есть собственный метод в моем менеджере моделей, который позволяет мне прослушивать уведомления о модификациях в БД, используя 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()
.