Su principal problema es que cada variable está limitada a la función en la que la escribió.
A menos que se declare lo contrario:
def db_init():
global conn
conn = psycopg2....
Un mejor enfoque sería convertir esto en una clase, un ejemplo básico sería:
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()
Ahora, el SELECT
la consulta no hará mucho ya que está usando cur.execute()
.
Pero mantuve esto a propósito para mantener el código similar al que escribiste, querrás cambiarlo para devolver los valores, sin embargo, si llamas a una consulta que se espera que devuelva un valor y así sucesivamente.
Su enfoque que se centra en las funciones tendrá problemas de "espacio de nombres" donde las variables viven en un ámbito local de esa función y otras funciones normalmente no pueden acceder a ellas.
En cambio, las variables de ámbito de clase pueden acceder a sus propias variables y no están tan limitadas de fábrica.
Podría hacer variables globales y declararlas como globales en las funciones, pero creo que como mencioné en un comentario: