PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Semplifica l'utilizzo del database (psycopg2) creando un modulo

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: