あなたの主な問題は、各変数があなたがそれを書いた関数に制限されているということです。
特にそのように宣言されていない限り:
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()
を使用しているため、クエリはあまり機能しません 。
しかし、コードをあなたが書いたものと同じに保つために意図的にこれを維持しました。値を返すことが期待されるクエリを呼び出す場合など、値を返すためにそれを交換する必要があります。
関数に焦点を当てたアプローチでは、変数がその関数のローカルスコープに存在し、他の関数では通常それらにアクセスできないという「名前空間」の問題が発生します。
代わりに、クラススコープの変数はそれ自体の変数にアクセスでき、すぐに使用できるように制限されていません。
グローバル変数を作成し、関数でグローバルとして宣言することもできますが、コメントで述べたように: