为什么我可以通过外壳连接到MySQL,但不能通过Python连接到MySQL?

时间:2020-09-07 09:07:03

标签: python mysql shell ssh

我正在通过服务器上的SSH连接到MySQL数据库。我设法通过MySql工作台和系统外壳来做到这一点,这意味着密码,用户名和ip是正确的并且允许使用。

现在我正在尝试通过Python连接。我正在使用sshtunnel软件包,其设置与工作台中的设置相同(在shell中均为默认设置)-mysql端口3306,ssh端口22,mysql主机名127.0.0.1,它连接了我。 当我尝试通过连接器连接到数据库时,我得到了:

mysql.connector.errors.ProgrammingError:1045(28000):访问被拒绝 用户“ myusername” @“ localhost”(使用密码:是)。

我还尝试了使用以下命令通过python直接通过shell连接: os.system("mysql -u myusername -p") 然后我得到了:

错误1045(28000):用户'myusername'@'localhost'的访问被拒绝 (使用密码:是)

我在这里检查了

Can't access MySQL through MySQL Workbench or HeidiSQL, but can access through shell

Accessing MySQL from Python 3: Access denied for user

还有更多,但我发现没有帮助。 我的Python版本是3.6.8,MySql版本是5.7.31。 python访问的shell和普通的Unix访问的shell有什么不同?还是工作台可以访问?

编辑:

请求的代码。这三个连接都给出了完全相同的输出。

with sshtunnel.SSHTunnelForwarder(
        (ssh_host, ssh_port),
        ssh_username=ssh_username,
        ssh_password=ssh_password,
        remote_bind_address=('localhost', mysql_port)) as tunnel:
    

    # conn = mysql.connector.connect(**mysql_config)
    conn = MySQLdb.connect(host="localhost", 
    user="myusername", passwd="password", db="mydb")
    print(conn)
    # print(os.system("mysql -u myusername -p"))

1 个答案:

答案 0 :(得分:1)

我设法联系:

tunnel = sshtunnel.SSHTunnelForwarder((ssh_host, 22), ssh_password=ssh_password, ssh_username=ssh_username,
     remote_bind_address=('localhost', 3306))
tunnel.start()

显然,区别是保持隧道开放而不是使用“ with”语句,尽管我不了解实际发生了什么,并且我希望解释。