Masalah utama Anda, adalah bahwa setiap variabel terbatas pada fungsi tempat Anda menulisnya.
Kecuali dinyatakan lain seperti:
def db_init():
global conn
conn = psycopg2....
Pendekatan yang lebih baik adalah mengubahnya menjadi kelas, contoh dasarnya adalah:
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()
Sekarang, SELECT
kueri tidak akan banyak membantu karena Anda menggunakan cur.execute()
.
Tetapi saya menyimpan ini dengan tujuan untuk menjaga agar kode tetap serupa dengan apa yang Anda tulis, Anda akan ingin menukarnya untuk mengembalikan nilai namun jika memanggil kueri yang diharapkan mengembalikan nilai dan seterusnya.
Pendekatan Anda yang berfokus pada fungsi akan memiliki masalah "ruang nama" di mana variabel berada dalam lingkup lokal fungsi tersebut dan di sana untuk fungsi lain biasanya tidak dapat mengaksesnya.
Sebagai gantinya, variabel cakupan kelas dapat mengakses variabelnya sendiri dan tersedia untuk tidak terbatas di luar kotak.
Anda dapat membuat variabel global dan mendeklarasikannya sebagai global dalam fungsi, tetapi saya pikir seperti yang saya sebutkan dalam komentar: