mirror of
				https://github.com/zulip/zulip.git
				synced 2025-10-31 03:53:50 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			43 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			43 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from collections.abc import Iterator
 | |
| from contextlib import contextmanager
 | |
| 
 | |
| import sqlalchemy
 | |
| from django.db import connection
 | |
| from sqlalchemy.engine import Connection, Engine
 | |
| from typing_extensions import override
 | |
| 
 | |
| from zerver.lib.db import TimeTrackingConnection
 | |
| 
 | |
| 
 | |
| # This is a Pool that doesn't close connections.  Therefore it can be used with
 | |
| # existing Django database connections.
 | |
| class NonClosingPool(sqlalchemy.pool.NullPool):
 | |
|     @override
 | |
|     def status(self) -> str:
 | |
|         return "NonClosingPool"
 | |
| 
 | |
|     def _do_return_conn(self, conn: sqlalchemy.engine.base.Connection) -> None:
 | |
|         pass
 | |
| 
 | |
| 
 | |
| sqlalchemy_engine: Engine | None = None
 | |
| 
 | |
| 
 | |
| @contextmanager
 | |
| def get_sqlalchemy_connection() -> Iterator[Connection]:
 | |
|     global sqlalchemy_engine
 | |
|     if sqlalchemy_engine is None:
 | |
| 
 | |
|         def get_dj_conn() -> TimeTrackingConnection:
 | |
|             connection.ensure_connection()
 | |
|             return connection.connection
 | |
| 
 | |
|         sqlalchemy_engine = sqlalchemy.create_engine(
 | |
|             "postgresql://",
 | |
|             creator=get_dj_conn,
 | |
|             poolclass=NonClosingPool,
 | |
|             pool_reset_on_return=None,
 | |
|         )
 | |
|     with sqlalchemy_engine.connect().execution_options(autocommit=False) as sa_connection:
 | |
|         yield sa_connection
 |