代码之家  ›  专栏  ›  技术社区  ›  FTM

django.db.connection不支持fileno()方法

  •  0
  • FTM  · 技术社区  · 6 年前

    我的模型管理器上有一个自定义方法,它允许我使用 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 图书馆。所以我想知道为什么我不能用 文件() 方法。

    0 回复  |  直到 6 年前