Ditt huvudproblem är att varje variabel är begränsad till funktionen du skrev den i.
Om inget annat anges som sådant:
def db_init():
global conn
conn = psycopg2....
Ett bättre tillvägagångssätt skulle vara att konvertera detta till en klass, ett grundläggande exempel skulle vara:
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()
Nu, SELECT
fråga kommer inte att göra mycket eftersom du använder cur.execute()
.
Men jag behöll detta med avsikt för att behålla koden som liknar den du skrev, du vill byta ut den för att returnera värdena men om du ringer en fråga som förväntas returnera ett värde och så vidare.
Ditt tillvägagångssätt som är fokuserat på funktioner kommer att ha "namnutrymme"-problem där variabler finns i en lokal omfattning av den funktionen och där för andra funktioner normalt inte kan komma åt dem.
Istället kan klassomfångade variabler komma åt sina egna variabler och är inte så begränsade direkt.
Du kan göra globala variabler och deklarera dem som globala i funktionerna, men jag tror som jag nämnde i en kommentar: