我无法远程访问 MySQL。 我使用 SSH 隧道并想使用 Python+SQLALchemy 连接数据库 MySQL。

当我在控制台中使用 MySQL-client 并指定“ ptotocol=TCP ”时,一切都很好! 我使用命令:

mysql -h localhost —protocol=TCP -u USER -p

我可以通过 SSH 隧道访问远程数据库。

但是,当我想使用 Python+SQLAchemy 连接到数据库时,我找不到像—protocol=TCP这样的选项,否则,我只能连接到本地 MySQL 数据库。 请告诉我,有没有办法使用 SQLAlchemy 来做到这一点。

#1楼 票数:33 已采纳

这个问题的经典答案是使用127.0.0.1主机IP主机名,而不是“特殊名称” localhost 文档

[...] Unix 到localhost 的连接默认使用 Unix 套接字文件建立

然后:

在 Unix 上,MySQL 程序特别对待主机名localhost ,与其他基于网络的程序相比,它的方式可能与您期望的不同。 对于到 localhost 的连接,MySQL 程序尝试使用 Unix 套接字文件连接到本地服务器。 即使提供了 --port 或 -P 选项来指定端口号,也会发生这种情况。 要确保客户端与本地服务器建立 TCP/IP 连接,请使用 --host 或 -h 指定主机名值 127.0.0.1,或本地服务器的 IP 地址或名称。


但是,这个简单的技巧在您的情况下似乎不起作用,因此您必须以某种方式强制使用 TCP 套接字。 正如您自己解释的那样,在命令行上调用mysql时,您使用--protocol tcp选项。

正如解释在这里,从SQLAlchemy的,您可以通过相关选项(如果有的话)到你的驱动程序的URL选项使用connect_args关键字参数。

例如使用PyMySQL ,在我为此目的设置的测试系统(MariaDB 10.0.12、SQLAlchemy 0.9.8 和 PyMySQL 0.6.2)上,我得到了以下结果:

>>> engine = create_engine(
      "mysql+pymysql://sylvain:passwd@localhost/db?host=localhost?port=3306")
#                                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^
#                               Force TCP socket. Notice the two uses of `?`
#                               Normally URL options should use `?` and `&`  
#                               after that. But that doesn't work here (bug?)
>>> conn = engine.connect()
>>> conn.execute("SELECT host FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = CONNECTION_ID()").fetchall()
[('localhost:54164',)]

# Same result by using 127.0.0.1 instead of localhost: 
>>> engine = create_engine(
      "mysql+pymysql://sylvain:passwd@127.0.0.1/db?host=localhost?port=3306")
>>> conn = engine.connect()
>>> conn.execute("SELECT host FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = CONNECTION_ID()").fetchall()
[('localhost:54164',)]

# Alternatively, using connect_args:
>>> engine = create_engine("mysql+pymysql://sylvain:passwd@localhost/db",
                       connect_args= dict(host='localhost', port=3306))
>>> conn = engine.connect()
>>> conn.execute("SELECT host FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = CONNECTION_ID()").fetchall()
[('localhost:54353',)]

正如您所注意到的,两者都将使用 TCP 连接(我知道这是因为主机名后面的端口号)。 另一方面:

>>> engine = create_engine(
      "mysql+pymysql://sylvain:passwd@localhost/db?unix_socket=/path/to/mysql.sock")
#                                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
#                               Specify the path to mysql.sock in
#                               the `unix_socket` option will force
#                               usage of a UNIX socket

>>> conn = engine.connect()
>>> conn.execute("SELECT host FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = CONNECTION_ID()").fetchall()
[('localhost',)]

# Same result by using 127.0.0.1 instead of localhost: 
>>> engine = create_engine(
      "mysql+pymysql://sylvain:passwd@127.0.0.1/db?unix_socket=/path/to/mysql.sock")
>>> conn = engine.connect()
>>> conn.execute("SELECT host FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = CONNECTION_ID()").fetchall()
[('localhost',)]

# Alternatively, using connect_args:
>>> engine = create_engine("mysql+pymysql://sylvain:passwd@localhost/db",
                       connect_args= dict(unix_socket="/path/to/mysql.sock"))
>>> conn = engine.connect()
>>> conn.execute("SELECT host FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = CONNECTION_ID()").fetchall()
[('localhost',)]

主机名后没有端口:这是一个 UNIX 套接字。

#2楼 票数:11

在我的设置中(我使用的是 mysql-python),在 MySQL SQLAlchemy url 中只使用 127.0.0.1 而不是 localhost 。 我完全用于该场景(具有本地端口 3307 的隧道)的完整 url 是:

mysql:/user:passwd@127.0.0.1:3307/

我正在使用 SQLAlchemy 1.0.5,但我想这并不重要......

#3楼 票数:5

这对我有用:

import pandas as pd
import pymysql
from sqlalchemy import create_engine

cnx = create_engine('mysql+pymysql://<username>:<password>@<host>/<dbname>')    
df = pd.read_sql('SELECT * FROM <table_name>', cnx) #read the entire table

像这样将凭据添加到 mysql 数据库的地方:

CREATE USER '<username>' IDENTIFIED BY '<password>';
GRANT ALL PRIVILEGES ON *.* TO '<username>' WITH GRANT OPTION;
FLUSH PRIVILEGES;

#4楼 票数:0

我试过这个来连接 xampp 服务器的 mysql db

from sqlalchemy import create_engine

engine = create_engine("mysql+pymysql://usrnme:passwd@hstnme/dbname")

  ask by strevg translate from so

未解决问题?本站智能推荐:

1回复

使用带有公钥和密码的SSH隧道连接到SQLAlchemy的远程PostgreSQL数据库,所有这些都来自Windows机器

所以,我使用Windows通过Navicat等工具连接到远程Postgres数据库。 我试图使用Python(2.7)和SQLAlchemy(0.9)来实现相同的功能,但没有成功。 所以,我的Navicat设置如下所示: 我尝试在PuTTY中设置隧道,连接到服务器,保持连接打开并尝试使
2回复

用sqlalchemy查询远程数据库后SSHTunnelForwarder没有结束

通过sshtunnelforwarder成功连接到远程mysql数据库并在sqlalchemy的帮助下执行查询后,sshtunnelforwarder服务器不会停止。 在运行查询后,我尝试使用engine.dispose()来查看是否完成,但是没有完成。 它仅在未处理任何查询并使用engi
1回复

使用python3通过SSH(通过跳转主机)连接到MySQL数据库

我正在尝试在python和我的MySQL数据库(在AWS中)之间建立连接。 SSH隧道工作正常,如果事后发生有关随后开始与数据库的连接的问题,则会发生问题。 这是我的代码: 从sqlalchemy导入sshtunnel导入create_engine从SSHTunnelForwarder
2回复

sqlalchemy.exc.OperationalError:(pymysql.err.OperationalError)(2013,'LostconnectiontoMySQLserverduringquery')

我正在使用 Python、Flask 和 SQLAlchemy。 在构建我的应用程序时,我一直在使用本地数据库,并且使用以下代码运行良好: 现在,我试图让这段代码使用 Python 包 sshtunnel 连接到远程数据库。 下面是这段代码的样子: 看起来像这样正在连接,但在启动我的烧瓶应用程序后,
1回复

Python脚本通过SSH隧道连接到Namecheap上的MySQL数据库

自从过去两天谷歌搜索和阅读论坛以来,我一直在尝试某些尝试,但没有成功。 我在Namecheap.com上托管有一个MySQL数据库,我需要通过Python脚本从本地linux计算机访问该数据库以创建表和条目。 Namecheap说“ “出于安全原因,我们共享服务器上的远程MySQL连接
1回复

当数据库只能通过jumphost访问时,如何通过Python连接MySQL[重复]

这个问题在这里已有答案: 启用Python通过SSH隧道连接到MySQL 4个答案 我有一个MySQL数据库,只能通过jumphost访问。 我们尝试访问MySQL的拓扑如下 客户端主机 - > jumphost - > MySQL 使用以下命令通过SSL
1回复

通过SSH隧道访问远程数据库

我想通过SSH隧道访问远程数据库。 我想在此远程服务器172.17.9.125上创建一个名为“ TESTDB”的新数据库。 但是我在本地主机中创建了这个数据库。 我在这里做错了什么?
1回复

如何使用SQLalchemy安全地连接到MySQL数据库?

我正在开发一个Python3 / tkinter应用程序,我希望它具有基于远程MySQL服务器的数据库功能。 我找到了SQLalchemy,我试图了解远程访问和用户身份验证方面的最佳实践。 将有一个客户端应用程序将要求输入用户名和密码,然后它将获取,插入和更新远程数据库中的数据。 现在,