Вашият основен проблем е, че всяка променлива е ограничена до функцията, в която сте я написали.
Освен ако не е декларирано друго като такова:
def db_init():
global conn
conn = psycopg2....
По-добър подход би бил да преобразувате това в клас, основен пример би бил:
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()
Сега SELECT
заявката няма да направи много, тъй като използвате cur.execute()
.
Но запазих това нарочно, за да запазя кода подобен на написаното от вас, ще искате да го размените, за да върне стойностите, но ако извиквате заявка, която се очаква да върне стойност и т.н.
Вашият подход, който е фокусиран върху функциите, ще има проблеми с пространството на имената, където променливите живеят в локален обхват на тази функция и други функции обикновено нямат достъп до тях.
Вместо това променливите с обхват на класа могат да имат достъп до собствените си променливи и не са ограничени от кутията.
Можете да направите глобални променливи и да ги декларирате като глобални във функциите, но мисля, че както споменах в коментар: