You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

客户端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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 06:25:33