这是我想要运行的示例代码:
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 次 |
最近记录: |