当总是连接到不同函数中的同一个数据库时,如何保存连接并减少参数传递?

时间:2015-07-29 21:02:04

标签: python refactoring psycopg2

如果你有很多功能连接到数据库,你怎么做,所以你不要1)向每个函数传递很多参数2)每次都不建立(和关闭)新连接。 在pythonic伪代码中

main():
    db = …
    host = …
    username = …
    password = …
    some_function(db, host, username, password)

some_function(db, host, username, password):
   try:
   con = psycopg2.connect("dbname='{}' user='{}' password='{}' host='{}'".format(db, username, password, host))
   cur = con.cursor()
   cur.execute("SELECT * FROM {}.{};".format(schema, ‘myTable’))
   function2(cur.fetchall(),db, host, username, password)
…
    except:
        …

Function2(db, host, username, password):
   try:
     con = psycopg2.connect("dbname='{}' user='{}' password='{}' host='{}'".format(db, username, password, host))
     cur = con.cursor()
     cur.execute("SELECT * FROM {}.{};".format(schema, ‘otherTable’))
     function3(cur.fetchall(),db, host, username, password)
     …
    except:
        …

令人遗憾的是,some_function()function2()几乎完全相同(尽管内部会有所不同)。我想知道如何提取此代码以减少冗余?至少如何使用db, host, username, password减少功能签名?

我想把它们作为全局变量,所以至少我不必将变量传递给需要数据库的每个函数。

2 个答案:

答案 0 :(得分:0)

尝试创建一个单独的db类,它接受一次参数,然后你只需要调用getInstance()来获取对象,并使用open()来获取连接。

答案 1 :(得分:0)

这就是我的工作

class Database():
    def __init__(self):
        db = ....
        host = …
        username = …
        password = …
        self.con = psycopg2.connect("dbname='{}' user='{}' password='{}' host='{}'".format(db, username, password, host))
        self.cur = con.cursor()

    def function1(self):
        try:
            self.cur.execute("SELECT * FROM {}.{};".format(schema, ‘myTable’))
            msg = self.cursor.fetchall()
        except:
            ...

使用此功能,您只需connect一次,即可在班级内分别使用cursordatabase访问self.curself.con。 /> 您现在可以创建任意数量的函数,类似于可以访问数据库的function1