[英]Python - Calling python function from another script
我正在尝试从另一个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
谁能帮助我确定我在哪里出了问题。 谢谢
db_cur
在db_login
具有本地作用域。 这意味着无法在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')
在python中,“ global”实际上意味着“模块级全局”,而不是“应用程序全局”,因此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()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.