Vấn đề chính của bạn, là mỗi biến bị giới hạn trong hàm bạn đã viết nó.
Trừ khi được khai báo như vậy:
def db_init():
global conn
conn = psycopg2....
Một cách tiếp cận tốt hơn sẽ là chuyển đổi này thành một lớp, một ví dụ cơ bản sẽ là:
import psycopg2
class MyDatabase():
def __init__(self, db="mydb", user="postgres"):
self.conn = psycopg2.connect(database=db, user=user)
self.cur = self.conn.cursor()
def query(self, query):
self.cur.execute(query)
def close(self):
self.cur.close()
self.conn.close()
db = MyDatabase()
db.query("SELECT * FROM table;")
db.close()
Bây giờ, SELECT
truy vấn sẽ không hiệu quả nhiều vì bạn đang sử dụng cur.execute()
.
Nhưng tôi cố ý giữ điều này để giữ cho mã tương tự như những gì bạn đã viết, bạn sẽ muốn hoán đổi mã đó để trả về các giá trị tuy nhiên nếu gọi một truy vấn được mong đợi trả về một giá trị, v.v. / P>
Cách tiếp cận của bạn tập trung vào các hàm sẽ có vấn đề về "không gian tên" trong đó các biến nằm trong phạm vi cục bộ của hàm đó và ở đó các hàm khác thường không thể truy cập chúng.
Thay vào đó, các biến trong phạm vi lớp có thể truy cập các biến của chính nó và ở đó không giới hạn.
Bạn có thể tạo các biến toàn cục và khai báo chúng là toàn cục trong các hàm, nhưng tôi nghĩ như tôi đã đề cập trong một nhận xét: