PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Simplifique o uso do banco de dados (psycopg2) criando um módulo


Seu principal problema é que cada variável é limitada à função em que você a escreveu.
A menos que declarado de outra forma:
def db_init():
    global conn
    conn = psycopg2....

Uma abordagem melhor seria converter isso em uma classe, um exemplo básico seria:
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()

Agora, o SELECT consulta não fará muito, pois você está usando cur.execute() .
Mas eu mantive isso de propósito para manter o código semelhante ao que você escreveu, você vai querer trocar isso para retornar os valores, no entanto, se estiver chamando uma consulta que deve retornar um valor e assim por diante.

Sua abordagem focada em funções terá problemas de "namespace" onde as variáveis ​​vivem em um escopo local dessa função e outras funções normalmente não podem acessá-las.

Em vez disso, as variáveis ​​com escopo de classe podem acessar suas próprias variáveis ​​e não são tão limitadas imediatamente.

Você poderia fazer variáveis ​​globais e declará-las como globais nas funções, mas acho que como mencionei em um comentário: