带有 autocommit=True 的 sqlalchemy 会话不提交

Joh*_*don 5 python sqlalchemy commit

我正在尝试使用 autocommit=true 的会话在表中创建一行,但它似乎不起作用。该行不会保存到表中。

import os

import sqlalchemy
from sqlalchemy import Table
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy import Column, create_engine, String

db_hostname    = os.environ['DB_HOSTNAME']
db_username    = os.environ['DB_USERNAME']
db_password    = os.environ['DB_PASSWORD']
db_servicename = os.environ['DB_SERVICENAME']

engine_string = f"postgresql://{db_username}:{db_password}@{db_hostname}:5432/{db_servicename}"

engine = create_engine(engine_string, isolation_level='REPEATABLE READ',
    poolclass=sqlalchemy.pool.NullPool
)

base = declarative_base()

class Testing(base):
    __tablename__ = 'testing'
    name = Column(String, primary_key=True)
    comment = Column(String)

base.metadata.create_all(engine)

S1 = sessionmaker(engine)
with S1() as session:
    test1 = Testing(name="Jimmy", comment="test1")
    session.add(test1)
    session.commit()

S2 = sessionmaker(engine, autocommit=True)
with S2() as session:
    test2 = Testing(name="Johnny", comment="test2")
    session.add(test2)
Run Code Online (Sandbox Code Playgroud)

在此代码中,名称为“Jimmy”且显式的第一行session.commit()被保存到表中。

但 name="Johnny" 的第二行未保存。在会话上指定autocommit=True似乎没有效果。

原因是什么?

Gor*_*son 9

如果启用SQLALCHEMY_WARN_20=1环境变量,您将看到

\n
\n

RemovedIn20Warning:Session.autocommit 参数已弃用,并将在 SQLAlchemy 版本 2.0 中删除。\xe2\x80\xa6

\n
\n

实现“自动提交”行为的“2.0 方式”是

\n
S2 = sessionmaker(engine)\nwith S2() as session, session.begin():\n    test2 = Testing(name="Johnny", comment="test2")\n    session.add(test2)\n    # no explicit session.commit() required\n
Run Code Online (Sandbox Code Playgroud)\n

with如果没有发生错误,当上下文管理器(块)退出时,更改将自动提交。

\n