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: