从工作进程访问数据库

时间:2014-05-08 17:30:25

标签: python postgresql redis psycopg2

我正在尝试使用Python,Redis和PostgreSQL放置需要访问数据库的作业。我正在做以下事情:

  1. 使用RQ将作业放入Redis队列:

    def queue_data(self, json_data):
        Queue().enqueue(process_data, json.dumps(json_data))
    
  2. process_data中,使用psycopg2对PostgreSQL数据库执行查询:

    def process_data(json_data):
        with psycopg2.connect("dbname=pgtest2db user=pgtest2user") as conn:
            with conn.cursor() as cursor:
                # I'm not actually doing this query, but you get the idea
                cursor.execute("SELECT * FROM some_table")
        conn.close()
    
  3. 显然,这远非最佳,因为每次调用process_data都会创建一个新连接。实现这一目标的最佳做法是什么?谁应该负责管理数据库连接池?

    请注意,我强迫自己不要使用ORM,因为我这样做是为了教自己,我想从更纯粹的角度理解这些模式。

    修改

    我最终使用了像这样的自定义工作者:

    import os
    import node
    
    import redis
    from rq import Worker, Queue, Connection
    from psycopg2.pool      import ThreadedConnectionPool
    
    listen = ['high', 'default', 'low']
    redis_url = os.getenv('REDISTOGO_URL', 'redis://localhost:6379')
    redis_conn = redis.from_url(redis_url)
    pool = ThreadedConnectionPool(minconn = 1, maxconn = 10, dsn = "dbname=pgtest2db user=pgtest2user")
    
    def process_data(json_data):
        dbconn = pool.getconn()
        result = perform_some_db_actions(dbconn, json_data)
        pool.putconn(dbconn)
        return result
    
    if __name__ == '__main__':
        with Connection(redis_conn):
            print "Setting up Redis"
            worker = Worker(map(Queue, listen))
            worker.work()
    

1 个答案:

答案 0 :(得分:0)

我知道为时已晚,但是每个想知道如何在RQ中使用psycopg2的人(尤其是当您遇到SSL错误时:解密失败或记录不正确的mac-只需在内部打开连接 worker(即任务。最好创建单例而不是每次都打开连接)。而不是在worker.work()函数之前。