如何在SQLAlchemy中使用READ ONLY事务模式?

问题描述 投票:0回答:3

在 PostgreSQL 中,事务访问模式可以更改为

READ ONLY
(docs)。在 SQLAlchemy 中,可以更改引擎的隔离级别,但没有为只读访问模式提供参数(docs)。

如何制作一个在连接上具有

READ ONLY
访问模式的引擎?

postgresql transactions sqlalchemy readonly
3个回答
15
投票

一种解决方案是对每笔交易执行一条语句:

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
行中设置模式,而不是单独的语句。


8
投票

使用 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

的示例

0
投票

使用

create_engine()
可以方便地在
execution_options()
级别设置只读,这意味着只读将应用于该引擎的所有连接:

from sqlalchemy import create_engine

engine = (create_engine("postgresql://scott:tiger@localhost:5432/mydatabase")
          .execution_options(postgresql_readonly=True))
© www.soinside.com 2019 - 2024. All rights reserved.