В Python «глобальный» действительно означает «глобальный на уровне модуля», а не «глобальный», поэтому dwh_connection
и dwh_cur
не будут автоматически доступны в file2
.
При этом, полагаясь на глобальные переменные, это плохая идея - вы db_login()
функция должны вернуть соединение вместо установки глобального (или в дополнение к установке глобального уровня модуля, если вы хотите избежать открытие нескольких соединений).
Кроме того, вам вообще не следует создавать курсор здесь - курсоры не являются реентерабельными и должны создаваться заново каждый раз, когда вам нужен (создание курсора очень дешево).
И, наконец, ваш обработчик исключений в db_login()
хуже, чем бесполезный, он просто вреден - вместо подробного сообщения об ошибке (и отслеживания), объясняющего как можно точнее, что пошло не так (так что у вас есть шанс отладить проблема), у вас просто совершенно бесполезное сообщение «ошибка соединения».
Короче говоря, "правильная" эквивалентная версия вашей функции:
def db_login():
return psycopg2.connect(db_details)
Также обратите внимание, что в вашем модуле file2.py
вы импортируете db_login
, но никогда не вызываете его:
from file1 import db_login
def foo():
db = db_login()
cursor = db.cursor()
try:
# do something with the cursor
finally:
# make sure you close the connection
db.close()