如何使用Python + SQLAlchemy远程连接MySQL数据库?

如何使用Python + SQLAlchemy远程连接MySQL数据库?,第1张

如何使用Python + SQLAlchemy远程连接MySQL数据库?

解决此问题的经典方法是使用

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套接字。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5673439.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存