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

uurity8g  于 2024-01-07  发布在  PostgreSQL
关注(0)|答案(3)|浏览(212)

在PostgreSQL中,transaction访问模式可以更改为READ ONLYdocs)。在SQLAlchemy中,可以更改引擎的隔离级别,但没有为只读访问模式(docs)提供参数。
如何在连接上使用READ ONLY访问模式?

uujelgoq

uujelgoq1#

一个解决方案是在每个事务上执行一个语句:

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

wswtfjt7

wswtfjt72#

使用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的示例

ffdz8vbo

ffdz8vbo3#

使用create_engine()execution_options()创建引擎很方便,因为它允许创建具有只读访问模式的引擎(这意味着只读应用于该引擎的所有连接):

from sqlalchemy import create_engine

engine = (create_engine("postgresql://scott:tiger@localhost:5432/mydatabase")
          .execution_options(postgresql_readonly=True))

字符串
也可能是以下(在文档中找到):

from sqlalchemy import create_engine

engine = create_engine("postgresql://scott:tiger@localhost:5432/mydatabase",
                       execution_options={"postgresql_readonly": True})

相关问题