====================
:py:mod:`sqlalchemy`
====================
- `Documentation `_
- `Core `_
- `Engine sharding `_
The intent of the ``Engine.execution_options()`` method is to implement "sharding" schemes where multiple ``Engine`` objects refer to the same connection pool, but are differentiated by options that would be consumed by a custom event:
.. code-block:: python
primary_engine = create_engine("mysql://")
shard1 = primary_engine.execution_options(shard_id="shard1")
shard2 = primary_engine.execution_options(shard_id="shard2")
Above, the ``shard1`` engine serves as a factory for Connection objects that will contain the execution option ``shard_id=shard1``, and ``shard2`` will produce Connection objects that contain the execution option ``shard_id=shard2``.
An event handler can consume the above execution option to perform a schema switch or other operation, given a connection. Below we emit a MySQL ``use`` statement to switch databases, at the same time keeping track of which database we’ve established using the ``Connection.info`` dictionary, which gives us a persistent storage space that follows the DBAPI connection:
.. code-block:: python
from sqlalchemy import event
from sqlalchemy.engine import Engine
shards = {"default": "base", shard_1: "db1", "shard_2": "db2"}
@event.listens_for(Engine, "before_cursor_execute")
def _switch_shard(conn, cursor, stmt, params, context, executemany):
shard_id = conn._execution_options.get('shard_id', "default")
current_shard = conn.info.get("current_shard", None)
if current_shard != shard_id:
cursor.execute("use %s" % shards[shard_id])
conn.info["current_shard"] = shard_id
- `ORM `_