PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Simplifiez l'utilisation de la base de données (psycopg2) en créant un module

Votre principal problème est que chaque variable est limitée à la fonction dans laquelle vous l'avez écrite.
Sauf indication contraire :

def db_init():
    global conn
    conn = psycopg2....

Une meilleure approche serait de convertir ceci en une classe, un exemple de base serait :

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()

Maintenant, le SELECT la requête ne fera pas grand-chose puisque vous utilisez cur.execute() .
Mais j'ai gardé cela exprès pour garder le code similaire à ce que vous avez écrit, vous voudrez l'échanger pour retourner les valeurs cependant si vous appelez une requête qui devrait retourner une valeur et ainsi de suite.

Votre approche centrée sur les fonctions aura des problèmes "d'espace de noms" où les variables vivent dans une portée locale de cette fonction et là pour d'autres fonctions ne peuvent normalement pas y accéder.

Au lieu de cela, les variables de portée de classe peuvent accéder à ses propres variables et sont là pour ne pas être aussi limitées.

Vous pouvez créer des variables globales et les déclarer comme globales dans les fonctions, mais je pense, comme je l'ai mentionné dans un commentaire :