Il tuo problema principale è che ogni variabile è limitata alla funzione in cui l'hai scritta.
Se non diversamente dichiarato in questo modo:
def db_init():
global conn
conn = psycopg2....
Un approccio migliore sarebbe convertire questo in una classe, un esempio di base potrebbe essere:
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()
Ora, il SELECT
query non farà molto poiché stai usando cur.execute()
.
Ma l'ho tenuto apposta per mantenere il codice simile a quello che hai scritto, ti consigliamo di scambiarlo per restituire i valori, tuttavia, se si chiama una query che dovrebbe restituire un valore e così via.
Il tuo approccio incentrato sulle funzioni avrà problemi di "spazio dei nomi" in cui le variabili risiedono in un ambito locale di quella funzione e lì per altre funzioni normalmente non possono accedervi.
Invece, le variabili con ambito di classe possono accedere alle proprie variabili e non sono così limitate fuori dagli schemi.
Potresti creare variabili globali e dichiararle come globali nelle funzioni, ma penso come ho detto in un commento: