在 PostgreSQL 中,事务访问模式可以更改为
READ ONLY
(docs)。在 SQLAlchemy 中,可以更改引擎的隔离级别,但没有为只读访问模式提供参数(docs)。
如何制作一个在连接上具有
READ ONLY
访问模式的引擎?
一种解决方案是对每笔交易执行一条语句:
engine = create_engine('postgresql+psycopg2://postgres:[email protected]:5432/')
@event.listens_for(engine, 'begin')
def receive_begin(conn):
conn.execute('SET TRANSACTION READ ONLY')
但最好在
BEGIN TRANSACTION
行中设置模式,而不是单独的语句。
使用 SQL Alchemy 1.4,可以使用
Connection.execution_options()
设置只读和可延迟模式。
with engine.connect() as conn:
conn = conn.execution_options(
isolation_level="SERIALIZABLE",
postgresql_readonly=True,
postgresql_deferrable=True
)
with conn.begin():
# ... work with transaction
以上是取自https://docs.sqlalchemy.org/en/14/dialects/postgresql.html#postgresql-readonly-deferrable
的示例create_engine()
可以方便地在execution_options()
级别设置只读,这意味着只读将应用于该引擎的所有连接:
from sqlalchemy import create_engine
engine = (create_engine("postgresql://scott:tiger@localhost:5432/mydatabase")
.execution_options(postgresql_readonly=True))