客户端Python程序无法连接远程MariaDB数据库求助
解决QODBC3连接远程MariaDB失败的问题
部署了MariaDB的服务器,客户端运行以下Python代码连接数据库:
def Connect(): # Credential reading from register servHost = RegRead("servHost") servPort = RegRead("servPort") dbName = RegRead("dbName") __dbUser = RegRead("dbUser") __dbPass = RegRead("dbPass") con = QSqlDatabase.addDatabase('QODBC3') driver = "DRIVER={MariaDB ODBC 3.1 Driver};" database = f"Database={dbName};" databaseName = driver+database con.setDatabaseName(databaseName) con.setHostName(servHost) con.setPort(servPort) if con.open(__dbUser, __dbPass): print("Connected") return True else: return False本地同时作为服务器和客户端时连接正常,分离后
Connect()返回False。客户端已安装MariaDB ODBC Connector,对应驱动存在,配置的用户DNS可正常连接数据库,但程序无法连接。代码本地测试正常,客户端未安装MariaDB Server,仅导入QSqlDatabase包。
排查与解决方案
1. 匹配ODBC驱动与Python程序位数
MariaDB ODBC驱动分32位和64位,Python程序位数必须和驱动完全一致:
- 执行
python -c "import sys; print(sys.maxsize > 2**32)"判断Python位数:输出True为64位,False为32位 - 打开对应位数的ODBC数据源管理器验证驱动存在:32位用
C:\Windows\SysWOW64\odbcad32.exe,64位用C:\Windows\System32\odbcad32.exe
2. 重构ODBC连接字符串
当前代码混合使用setHostName/setPort和连接字符串的方式可能存在解析冲突,改用完整连接字符串直接配置:
def Connect(): servHost = RegRead("servHost") servPort = RegRead("servPort") dbName = RegRead("dbName") __dbUser = RegRead("dbUser") __dbPass = RegRead("dbPass") con = QSqlDatabase.addDatabase('QODBC3') # 构造完整ODBC连接字符串 connection_str = ( f"DRIVER={{MariaDB ODBC 3.1 Driver}};" f"SERVER={servHost};" f"PORT={servPort};" f"DATABASE={dbName};" f"UID={__dbUser};" f"PWD={__dbPass};" ) con.setDatabaseName(connection_str) if con.open(): print("Connected") return True else: print(f"连接失败: {con.lastError().text()}") return False
3. 输出具体错误信息
修改代码打印连接失败的详细错误,精准定位问题:
else: print(f"连接失败: {con.lastError().text()}") return False
常见错误原因包括:用户无远程访问权限、端口被防火墙拦截、驱动版本不兼容等。
4. 开放数据库用户远程访问权限
登录服务器MariaDB,检查并修改用户权限:
-- 查看用户当前允许的访问IP SELECT user, host FROM mysql.user WHERE user = '你的用户名'; -- 授权用户远程访问(%代表所有IP,可替换为客户端固定IP) GRANT ALL PRIVILEGES ON 目标数据库名.* TO '用户名'@'%' IDENTIFIED BY '密码'; FLUSH PRIVILEGES;
5. 检查服务器端口与防火墙
- 执行
tel 服务器IP 3306验证端口是否可通 - 服务器端需在防火墙/安全组中开放3306端口(或自定义MariaDB端口)
6. 验证Qt ODBC驱动可用性
在代码中列出所有可用数据库驱动,确认QODBC3存在:
print(QSqlDatabase.drivers())
如果无QODBC3,说明PyQt/PySide包未包含ODBC驱动组件,需重新安装带ODBC支持的Qt绑定包。
内容的提问来源于stack exchange,提问作者Rinfra90
相关产品推荐
相关产品推荐

