Python拆分脚本后,自定义模块无法调用mysql.connector问题求助
问题解决步骤
1. 修复NameError: name 'mysql' is not defined错误
每个Python模块都是独立的命名空间,主程序导入mysql.connector不会自动让login模块也能访问到这个库。你需要在login.py文件顶部显式导入mysql.connector:
import mysql.connector def login(): print('Entered login') cnx = mysql.connector.connect(user='', password='', host='', database='') print(f"{cnx.user} is connected to the {cnx.database}") return cnx # 返回连接对象,方便其他模块复用
2. 实现数据库连接复用
如果要让多个模块共享同一个数据库连接,不要在每个模块里重复创建连接,推荐以下两种方式:
方式一:用单独的数据库连接模块
创建一个db_connection.py文件,专门管理数据库连接:
import mysql.connector # 初始化全局连接对象 cnx = None def get_db_connection(): global cnx if not cnx or not cnx.is_connected(): # 重新创建连接(处理连接断开的情况) cnx = mysql.connector.connect(user='', password='', host='', database='') return cnx
然后在login.py和其他需要数据库操作的模块里导入这个函数:
from db_connection import get_db_connection def login(): print('Entered login') cnx = get_db_connection() print(f"{cnx.user} is connected to the {cnx.database}")
所有模块共享同一个连接实例,避免重复创建连接消耗资源。
方式二:主程序统一管理连接
修改login函数返回连接对象,主程序保存后传递给其他需要的模块:
# login.py import mysql.connector def login(): print('Entered login') cnx = mysql.connector.connect(user='', password='', host='', database='') print(f"{cnx.user} is connected to the {cnx.database}") return cnx
主程序中:
import tkinter as tk import login # 全局变量存储数据库连接 db_connection = None def on_login_btn_click(): global db_connection db_connection = login.login() # 后续可将db_connection传给其他模块的函数,比如: # other_module.execute_query(db_connection, "SELECT * FROM table") root = tk.Tk() login_btn = tk.Button(root, text="Login", command=on_login_btn_click) login_btn.pack() root.mainloop()
额外注意事项
- 程序退出前记得调用
cnx.close()关闭数据库连接,避免资源泄漏 - 不要硬编码数据库账号密码,建议用配置文件或环境变量读取敏感信息
内容的提问来源于stack exchange,提问作者user23573046
相关产品推荐
相关产品推荐

