SQLAlchemy 2.0 NotImplementedError:engine.execute

And*_*ndi 10 python sqlalchemy

当尝试使用SQLAlchemy v1.4.15 中的方法NotImplementedError: This method is not implemented for SQLAlchemy 2.0.删除表时,我收到一个, 。delete

from sqlalchemy import Column, Integer, MetaData, String, Table, create_engine, delete

engine = create_engine("sqlite+pysqlite:///:memory:", echo=True, future=True)
metadata = MetaData()

user = Table(
    "users", metadata, Column("id", Integer, primary_key=True), Column("name", String)
)

metadata.create_all(engine)

engine.execute(user.delete())  # leading to Traceback
# NotImplementedError: This method is not implemented for SQLAlchemy 2.0.
Run Code Online (Sandbox Code Playgroud)

sna*_*erb 12

engine.execute在 SQLAlchemy 1.4 中已弃用,并将在 SQLAlchemy 2.0 中删除。您需要改为调用连接的执行方法:

from sqlalchemy import Column, Integer, MetaData, String, Table, create_engine, delete

# Setting future=True enforces 2.0 behaviour in 1.4.x and disables
# legacy features. 
engine = create_engine("sqlite+pysqlite:///:memory:", echo=True, future=True)
metadata = MetaData()

user = Table(
    "users", metadata, Column("id", Integer, primary_key=True), Column("name", String)
)

metadata.create_all(engine)

stmt = delete(user)
with engine.begin() as conn:
    conn.execute(stmt)

Run Code Online (Sandbox Code Playgroud)

  • `with engine.begin() as conn:` 也可以。`withengine.connect()` 和 `withengine.begin()` 之间的区别在于,如果没有显式的 `.commit()`,前者将自动回滚,而后者将自动提交。 (2认同)