这是我想要运行的示例代码:
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仍处于打开状态将禁止NullPool或dispose()关闭每个最后一个连接.
试图找出一个解决方案,以断开与数据库无关的问题(必须在分叉之前断开连接)。
在你的例子中:
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)
我用这个
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)
| 归档时间: |
|
| 查看次数: |
39519 次 |
| 最近记录: |