如果你有很多功能连接到数据库,你怎么做,所以你不要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
减少功能签名?
我想把它们作为全局变量,所以至少我不必将变量传递给需要数据库的每个函数。
答案 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
一次,即可在班级内分别使用cursor
和database
访问self.cur
和self.con
。 />
您现在可以创建任意数量的函数,类似于可以访问数据库的function1
。