解决此问题的经典方法是使用
127.0.0.1或 主机 的 IP 或 主机名, 而不是“特殊名称”
localhost。从文档中:
Unix上与 本地主机的 连接默认情况下使用Unix套接字文件进行
然后:
在Unix上,MySQL程序 特别对待主机名 localhost
,与其他基于网络的程序相比,它可能与您期望的方式不同。为了连接到localhost,MySQL程序尝试使用Unix套接字文件连接到本地服务器。即使给–
port或-P选项指定了端口号,也会发生这种情况。为确保客户端与本地服务器建立TCP / IP连接,请使用–host或-
h指定主机名值127.0.0.1,或本地服务器的IP地址或名称。
但是,这种简单的技巧似乎不适用于您的情况,因此您必须以某种方式 强制
使用TCP套接字。正如您自己解释的那样,在
mysql命令行上调用时,可以使用该
--protocol tcp选项。
正如解释在这里,从SQLAlchemy的,您可以通过相关选项(如果有的话)到你的驱动程序的网址选项 或 使用
connect_args关键字参数。
例如,在我为此目的设置的测试系统(MariaDB 10.0.12,SQLAlchemy 0.9.8和PyMySQL 0.6.2)上使用 PyMySQL
,我得到以下结果:
>>> 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套接字。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)