使用SQLAlChemy会话作为上下文管理器时,接收"属性错误:__Enter__&Quot;

2024-04-20Python开发问题
41

本文介绍了使用SQLAlChemy会话作为上下文管理器时,接收"属性错误:__Enter__&Quot;的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

我收到带有以下内容的AttributeError: __enter__。这与with Session(engine) as session相关:

from sqlalchemy import create_engine
from sqlalchemy import text
from sqlalchemy.orm import Session
from sqlalchemy import MetaData
from sqlalchemy import Table, Column, Integer, String
from sqlalchemy import ForeignKey

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

with engine.connect() as conn:
    conn.execute(text("CREATE TABLE some_table (x int, y int)"))
    conn.execute(text("INSERT INTO some_table (x, y) VALUES (:x, :y)"),[{"x": 1, "y": 1}, {"x": 2, "y": 4}])

with engine.begin() as conn:
    conn.execute(text("INSERT INTO some_table (x, y) VALUES (:x, :y)"),[{"x": 6, "y": 8}, {"x": 9, "y": 10},
    {"x": 11, "y": 12}, {"x": 13, "y": 14}])

with engine.connect() as conn:
    result = conn.execute(text("Select x,y From some_table"))
    for x, y in result:
        print(f"x:{x} y:{y}")

stmt = text("SELECT x, y FROM some_table WHERE y > :y ORDER BY x, y").bindparams(y=6)

with Session(engine) as session:
    result = session.execute(stmt)
    for row in result:
        print(f'x: {row.x}  y: {row.y}')

我使用的是蟒蛇1.3.23附带的SQLAlChemy版本。

推荐答案

通过上下文管理器运行会话构建/关闭进程,如下所示:

engine = create_engine(...)
Session = sessionmaker(bind=engine)

with Session() as session:
    session.add(something)
    session.commit()

在SQLAlChemy<;1.4上不受支持。

如果您的SQLAlChemy版本为例如1.3.x,则应改为:

engine = create_engine(...)
Session = sessionmaker(bind=engine)

session = Session()
session.add(something)
session.commit()

如果您确实想使用上下文管理器,同时又需要使用SQLAlChemy<;1.4,您可以使用以下方法(复制自SQLAlchemy docs):

### another way (but again *not the only way*) to do it ###

from contextlib import contextmanager

@contextmanager
def session_scope():
    """Provide a transactional scope around a series of operations."""
    session = Session()
    try:
        yield session
        session.commit()
    except:
        session.rollback()
        raise
    finally:
        session.close()


def run_my_program():
    with session_scope() as session:
        ThingOne().go(session)
        ThingTwo().go(session)

这篇关于使用SQLAlChemy会话作为上下文管理器时,接收&quot;属性错误:__Enter__&Quot;的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

The End

相关推荐

在xarray中按单个维度的多个坐标分组
groupby multiple coords along a single dimension in xarray(在xarray中按单个维度的多个坐标分组)...
2024-08-22 Python开发问题
15

Pandas中的GROUP BY AND SUM不丢失列
Group by and Sum in Pandas without losing columns(Pandas中的GROUP BY AND SUM不丢失列)...
2024-08-22 Python开发问题
17

pandas 有从特定日期开始的按月分组的方式吗?
Is there a way of group by month in Pandas starting at specific day number?( pandas 有从特定日期开始的按月分组的方式吗?)...
2024-08-22 Python开发问题
10

GROUP BY+新列+基于条件的前一行抓取值
Group by + New Column + Grab value former row based on conditionals(GROUP BY+新列+基于条件的前一行抓取值)...
2024-08-22 Python开发问题
18

PANDA中的Groupby算法和插值算法
Groupby and interpolate in Pandas(PANDA中的Groupby算法和插值算法)...
2024-08-22 Python开发问题
11

PANAS-基于列对行进行分组,并将NaN替换为非空值
Pandas - Group Rows based on a column and replace NaN with non-null values(PANAS-基于列对行进行分组,并将NaN替换为非空值)...
2024-08-22 Python开发问题
10