如何在MySQL中关闭sqlalchemy连接

mar*_*cho 42 mysql sqlalchemy

这是我想要运行的示例代码:

for i in range(1,2000):
    db = create_engine('mysql://root@localhost/test_database')
    conn = db.connect()
    #some simple data operations
    conn.close()
    db.dispose()
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以运行它而不会从MySQL获得"Too many connections"错误?我已经知道我可以处理连接,或者有连接池.我只想了解如何正确关闭sqlalchemy的连接.提前致谢!

zzz*_*eek 79

以下是如何正确编写该代码:

db = create_engine('mysql://root@localhost/test_database')
for i in range(1,2000):
    conn = db.connect()
    #some simple data operations
    conn.close()
db.dispose()
Run Code Online (Sandbox Code Playgroud)

也就是说,它Engine是连接工厂和连接,而不是连接本身.当您说conn.close(),连接将返回到Engine内的连接池,而不是实际关闭.

如果您确实希望实际关闭连接,即不进行池化,请通过NullPool以下方式禁用池:

from sqlalchemy.pool import NullPool
db = create_engine('mysql://root@localhost/test_database', poolclass=NullPool)
Run Code Online (Sandbox Code Playgroud)

通过上面的Engine配置,每次调用都conn.close()将关闭底层的DBAPI连接.

如果OTOH你实际上想要在每次调用时连接到不同的数据库,也就是说,你的硬编码"localhost/test_database"只是一个例子而你实际上有很多不同的数据库,那么使用的方法dispose()很好; 它将关闭未从池中检出的每个连接.

在所有上述情况中,重要的是Connection通过关闭对象close().如果您正在使用任何类型的"无连接"执行,即engine.execute()或者statement.execute(),ResultProxy应该完全读取从该执行调用返回的对象,或者通过其他方式显式关闭close().A Connection或者ResultProxy仍处于打开状态将禁止NullPooldispose()关闭每个最后一个连接.

  • `处置()`!我需要它来关闭会话,因为`session.close()` 还不够。我建议将其添加到 SQLAlchemy 文档中,根据我的经验,不清楚如何正确关闭会话。 (5认同)
  • 您调用 close(),如文档所述。dispose() 是不需要的,事实上,对于正常的 SQLAlchemy 使用,实际上从不需要显式调用 dispose()。随时通过电子邮件向 [邮件列表](http://groups.google.com/group/sqlalchemy) 发送有关您的特定问题的信息,也许您在会话中执行了一些特殊指令,例如“SET”使用池化(有一种不同的处理方式)。 (2认同)

Rom*_*net 6

试图找出一个解决方案,以断开与数据库无关的问题(必须在分叉之前断开连接)。

您也需要使连接池中的连接无效

在你的例子中:

for i in range(1,2000):
    db = create_engine('mysql://root@localhost/test_database')
    conn = db.connect()
    # some simple data operations
    # session.close() if needed
    conn.invalidate()
    db.dispose()
Run Code Online (Sandbox Code Playgroud)


la_*_*_it 6

我用这个

engine = create_engine('...')
with engine.connect() as conn:
    conn.execute(text(f"CREATE SCHEMA IF NOT EXISTS...")
engine.dispose()
Run Code Online (Sandbox Code Playgroud)

  • with engine.connect() as conn: <- 此后不应该自动关闭我的连接吗? (2认同)