use*_*538 8 python mysql ssh pymysql
我正在使用 python 测试与 mysql 服务器的连接。我需要 ssh 进入服务器并建立 mysql 连接。以下代码有效:
from sshtunnel import SSHTunnelForwarder
import pymysql
import mysql.connector
with SSHTunnelForwarder((ssh_host, 22), ssh_username=ssh_user, ssh_password=ssh_password,
remote_bind_address=("127.0.0.1", 3306)) as tunnel:
config = {
'user': user,
'password': password,
'host': tunnel.local_bind_host,
'port': tunnel.local_bind_port,
'database': db
}
conn = pymysql.connect(**config)
query = '''SELECT VERSION();'''
data = pd.read_sql_query(query, conn)
print(data)
connection.close()
Run Code Online (Sandbox Code Playgroud)
但是,当使用mysql.connector而不是pymysql如下所示时:
with SSHTunnelForwarder((ssh_host, 22), ssh_username=ssh_user, ssh_password=ssh_password,
remote_bind_address=("127.0.0.1", 3306)) as tunnel:
config = {
'user': user,
'password': password,
'host': tunnel.local_bind_host,
'port': tunnel.local_bind_port,
'database': db
}
conn = mysql.connector.connect(**config)
mycursor = cnx.cursor()
mycursor.execute("SELECT VERSION()")
myresult = mycursor.fetchall()
Run Code Online (Sandbox Code Playgroud)
代码停止于conn = mysql.connector.connect(**config). 它永远不会给出错误或停止,它只是挂在这条线上。
为什么是这样?
配置属性对该模块无效吗?
由于这里似乎有一个问题,我遵循了 @Andr\xc3\xa9 Restivo 的评论,它似乎对我有用,设置use_pure为True. 我不确定这到底是做什么的:
def __get_db_connection(self) -> None:\n """\n Connect to the database\n """\n try:\n logger.debug(f\'Connecting to mysql db "{self.config.mysql_database}"...\')\n with mysql.connector.connect(\n host=self.config.mysql_ip,\n port=self.tunnel.local_bind_port,\n user=self.config.mysql_user,\n password=self.config.mysql_password,\n database=self.config.mysql_database,\n use_pure=True\n ) as connection:\n self.connection = connection\n logger.info(connection)\n except mysql.connector as e:\n logger.error(e)\n raise\nRun Code Online (Sandbox Code Playgroud)\n