【问题标题】:How to Close a Connection When Using Jupyter SQL Magic?使用 Jupyter SQL Magic 时如何关闭连接?
【发布时间】:2025-12-06 17:55:01
【问题描述】:

我正在使用 SQL Magic 连接到一个 db2 实例。但是,当我查询完数据库后,我似乎无法在任何地方找到有关如何关闭连接的语法。

【问题讨论】:

    标签: sqlalchemy db2 jupyter-notebook jupyter-lab


    【解决方案1】:

    您不能使用 Jupyter SQL Magic 显式关闭连接。事实上,这也是使用 Jupyter SQL Magic 连接 DB2 的缺点之一。您需要关闭会话才能关闭 Db2 连接。希望这会有所帮助。

    【讨论】:

    • 你正好有源码吗?
    【解决方案2】:

    这可能不是很有用,并且在某种程度上它可能不能保证在未来工作。但是,如果您需要一种非常骇人听闻的方式来关闭连接,我可以这样做(对于 postgres db,我假设它对于 db2 类似):

    In[87]: connections = %sql -l
    Out[87]: {'postgresql://ngd@node1:5432/graph': <sql.connection.Connection at 0x7effdbcf6b38>}
    In[88]: conn = connections['postgresql://ngd@node1:5432/graph'] 
    In[89]: conn.session.close()
    In[90]: %sql SELECT 1
    ...
    StatementError: (sqlalchemy.exc.ResourceClosedError) This Connection is closed
    [SQL: SELECT 1]
    [parameters: [{'__name__': '__main__', '__doc__': 'Automatically created module for IPython interactive environment', '__package__': None, '__loader__': None, '__s ... (123202 characters truncated) ... stgresql://ngd@node1:5432/graph']", '_i28': "conn = connections['postgresql://ngd@node1:5432/graph']\nconn.session.close()", '_i29': '%sql SELECT 1'}]]
    

    一个大问题是——如果你想重新连接,那似乎不起作用。即使在运行 %reload_ext sql 并尝试再次连接后,当您尝试使用它时它仍然认为连接已关闭。因此,除非有人知道如何修复该行为,否则只有在您不想在重新启动内核之前再次重新连接(到具有相同参数的同一个数据库)时断开连接才有用。

    【讨论】:

      【解决方案3】:

      你也可以重启内核。

      【讨论】:

        【解决方案4】:

        这是我发现在会话结束时关闭所有连接的最简单方法。您必须重新启动内核才能重新建立连接。

        connections = %sql -l
        [c.session.close() for c in connections.values()]
        

        【讨论】:

          【解决方案5】:

          很抱歉迟到了,但我刚刚开始使用 SQL Magic,并且对不断出现的错误感到恼火。这是一个有点尴尬的补丁,但这有助于我使用它。

          def multiline_qry(qry):
              try:
                  %sql {qry}
              except Exception as ex:
                  if str(type(ex).__name__) != 'ResourceClosedError':
                      template = "An exception of type {0} occurred. Arguments:\n{1!r}"
                      message = template.format(type(ex).__name__, ex.args)
                      print (message)
              
          qry = '''DROP TABLE IF EXISTS EMPLOYEE;
          CREATE TABLE EMPLOYEE(firstname varchar(50),lastname varchar(50));
          INSERT INTO EMPLOYEE VALUES('Tom','Mitchell'),('Jack','Ryan');
          '''
          
          multiline_qry(qry)
          

          【讨论】:

            【解决方案6】:

            如果要关闭连接,请先注销笔记本。

            【讨论】:

              最近更新 更多