我正在尝试从另一个python脚本调用数据库连接。我不断收到错误NameError:名称
'db_cur'
未定义。下面给出的是我正在使用的代码:
file1.py
import psycopg2
def db_login():
global dwh_connection
global dwh_cur
try:
dwh_connection = psycopg2.connect(db_details)
db_cur = dwh_connection.cursor()
except:
print("Conn failed")
print('Connection Success')
file2.py
from file1 import db_login
def rep1():
db_cur.execute("""SQL statement""")
dwh_connection.commit()
dwh_connection.close()
print('Task Completed')
这会引发错误
NameError: name 'db_cur' is not defined
任何人都可以帮助我弄清楚我在哪里出错了。谢谢
答案 0 :(得分:0)
db_cur
在db_login
中具有本地范围。这意味着无法在db_login
外部对其进行访问。更好的方法是返回对象并在脚本2中使用返回的对象。
例如,file1.py:
import psycopg2
def db_login():
global dwh_connection
global dwh_cur
try:
dwh_connection = psycopg2.connect(db_details)
db_cur = dwh_connection.cursor()
return db_cur
except:
print("Conn failed")
return None
print('Connection Success')
file2.py
from file1 import db_login
def rep1():
db_cur = db_login()
if db_cur is not None:
db_cur.execute("""SQL statement""")
dwh_connection.commit()
dwh_connection.close()
print('Task Completed')
答案 1 :(得分:0)
在python中,“全局”实际上表示“模块级全局”,而不是“应用程序全局”,因此dwh_connection
和dwh_cur
在file2
中不会自动可用。 / p>
这就是说,在这里依赖全局变量是一个坏主意-您的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()