【发布时间】:2021-01-14 08:27:59
【问题描述】:
我在 python 类中通过 SSH 连接到 MySQL 的代码:
def executeQuery(self, query_string):
print("connecting to database " + self.sql_main_database)
with SSHTunnelForwarder(
(
self.ssh_host,
self.ssh_port),
ssh_username = self.ssh_user,
ssh_pkey = self.pkey,
remote_bind_address=(self.sql_hostname, self.sql_port)
) as tunnel:
print("performing connection")
conn = pymysql.connect(
host="127.0.0.1",
user=self.sql_username,
password=self.sql_password,
db=self.sql_main_database,
port=tunnel.local_bind_port)
query = query_string
print("Querying")
data = pd.read_sql_query(query, conn)
print("Done!")
conn.close()
return data
代码运行良好,但是当查询定义不明确时,笔记本会冻结。
然后,我尝试使用try/catch,代码就这样结束了
def executeQuery(self, query_string):
try:
with SSHTunnelForwarder(
(
self.ssh_host,
self.ssh_port
),
ssh_username = self.ssh_user,
ssh_pkey = self.pkey,
remote_bind_address=(self.sql_hostname, self.sql_port)
) as tunnel:
try:
conn = pymysql.connect(
host = "127.0.0.1",
user = self.sql_username,
password = self.sql_password,
db = self.sql_main_database,
port = tunnel.local_bind_port
)
try:
query = query_string
data = pd.read_sql_query(query, conn)
return data
except DatabaseError as e:
Log.debug(self,str(e))
raise DatabaseError
except pymysql.err.InternalError as e:
Log.debug(self, str(e))
raise DataError
except Exception as e:
Log.debug(self, "[Error]Setting up database: \'" + self.sql_main_database + "\'")
raise DataError
问题是 pd.read_sql_query 永远不会停止,因此永远不会调用 except,尝试不会失败,并且该过程将永远继续
超时解决方法是不可能的,因为查询没有定义的执行时间,其中一些可以在几个小时内保持处理。
我不知道如何解决它。
【问题讨论】:
-
您可以使用 PyMySQL 超时:pymysql.readthedocs.io/en/latest/modules/connections.html
-
超时解决方法是不可能的,因为查询没有定义的执行时间,其中一些可以在几个小时内保持处理。
标签: mysql pandas ssh jupyter-notebook