Vaším hlavním problémem je, že každá proměnná je omezena na funkci, ve které jste ji napsali.
Pokud není uvedeno jinak:
def db_init():
global conn
conn = psycopg2....
Lepším přístupem by bylo převést to na třídu, základní příklad by byl:
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()
Nyní SELECT
dotaz toho moc neudělá, protože používáte cur.execute()
.
Ale nechal jsem to záměrně, abych zachoval kód podobný tomu, co jste napsali, budete jej chtít vyměnit, aby vrátil hodnoty, ale pokud voláte dotaz, u kterého se očekává, že vrátí hodnotu a tak dále.
Váš přístup, který se zaměřuje na funkce, bude mít problémy se „jmenným prostorem“, kde proměnné žijí v místním rozsahu dané funkce a tam pro ostatní funkce k nim normálně nemají přístup.
Místo toho mohou proměnné s rozsahem třídy přistupovat ke svým vlastním proměnným a nejsou zde tak omezené.
Mohli byste vytvořit globální proměnné a deklarovat je jako globální ve funkcích, ale myslím, jak jsem zmínil v komentáři: