连接到 PythonAnywhere SQL Server 的问题

Posted

技术标签:

【中文标题】连接到 PythonAnywhere SQL Server 的问题【英文标题】:Issues connecting to PythonAnywhere SQL Server 【发布时间】:2021-12-05 05:39:12 【问题描述】:

我正在尝试在我的本地计算机上运行在 pythonAnywhere 上的 mysql 服务器中创建一个表。 我遵循了入门指南https://help.pythonanywhere.com/pages/AccessingMySQLFromOutsidePythonAnywhere,但遇到了 OperationalError: (2013, 'Lost connection to MySQL server during query')。

这是我的代码:

import MySQLdb
import sshtunnel

sshtunnel.SSH_TIMEOUT = 10
sshtunnel.TUNNEL_TIMEOUT = 10
with sshtunnel.SSHTunnelForwarder(
    ('ssh.pythonanywhere.com'),
    ssh_username='MyUSERNAME', ssh_password='***',
    remote_bind_address=('MyUSERNAME.mysql.pythonanywhere-services.com', 3306)
) as tunnel:
    connection = MySQLdb.connect(
        user='MyUSERNAME',
        passwd='***',
        host='127.0.0.1', port=tunnel.local_bind_port,
        db='MyUSERNAME$liveSports',
    )



cur = connection.cursor()
with connection:
    cur.execute("CREATE TABLE table_one (date TEXT, start_time TEXT)")

我不确定为什么会收到此错误,或者如何解决它。 类似的错误 Lost connection to MySQL server during query 表明我向我的服务器发送了一个不正确的查询,但据我所知这是一个有效的查询,或者我的数据包太大,我不相信空表会的。

我是 SQL 新手,但我似乎找不到这个问题的答案。

【问题讨论】:

这就是你的代码的样子,包括确切的缩进吗?如果是这样,那就是问题所在。一旦“with”语句退出,SSH 隧道将关闭,您将失去连接。您需要在使用连接的整个过程中保持隧道打开。 with 在这里可能不是正确的选择。 这就是我的代码的样子。我对 sqlite 稍微熟悉一些,使用 with connection 可以让我用光标在服务器上执行命令。我应该如何解决错误?这段代码直接取自 pythonanywhere 指南减去游标执行。 你看我的回复了吗?我告诉过你如何解决它。您要么将所有代码放在 with 语句中,要么只执行 tunnel = SSHTunnelForwarder(...) 并将其保留为全局,而不使用 with 【参考方案1】:

您必须让隧道保持畅通。这是简单的方法:

import MySQLdb
import sshtunnel

sshtunnel.SSH_TIMEOUT = 10
sshtunnel.TUNNEL_TIMEOUT = 10
tunnel = sshtunnel.SSHTunnelForwarder(
    ('ssh.pythonanywhere.com'),
    ssh_username='MyUSERNAME', ssh_password='***',
    remote_bind_address=('MyUSERNAME.mysql.pythonanywhere-services.com', 3306)
)
connection = MySQLdb.connect(
    user='MyUSERNAME',
    passwd='***',
    host='127.0.0.1', port=tunnel.local_bind_port,
    db='MyUSERNAME$liveSports',
)

cur = connection.cursor()
cur.execute("CREATE TABLE table_one (date TEXT, start_time TEXT)")

您可以将所有数据库内容放在一个函数中并使用

with sshtunnel.SSHTunnelForwarder(
    ('ssh.pythonanywhere.com'),
    ssh_username='MyUSERNAME', ssh_password='***',
    remote_bind_address=('MyUSERNAME.mysql.pythonanywhere-services.com', 3306)
) as tunnel:
    do_all_processing()

def do_all_processing():
    connection = MySQLdb.connect(
        user='MyUSERNAME',
        passwd='***',
        host='127.0.0.1', port=tunnel.local_bind_port,
        db='MyUSERNAME$liveSports',
    )
    ...etc...

【讨论】:

您好,谢谢您的回复,我没有完全理解您的回复。我现在看到省略with 将允许我在数据库连接打开的情况下执行命令。我正在使用一个类,所以我需要打开数据库连接以允许我的数据抓取器与连接进行交互并将信息传递给数据库。谢谢你的回答。 一切都必须在with 块中发生。

以上是关于连接到 PythonAnywhere SQL Server 的问题的主要内容,如果未能解决你的问题,请参考以下文章

从 Azure Sql 迁移到 Azure Synapse,无法连接到 Airflow 中的 Synapse

Cloud Composer 工作器无法连接到外部数据库

无法连接到 iPhone se2 上的 React-Native 语音通话

使用 JSch 从 Java 连接到 SSH 服务器时出现“JSchException:拒绝 HostKey”

java怎么判断成功连接到数据库

如何在 Python 中进行 ***/代理连接?