python - Sqlalchemy session ,删除似乎不起作用

标签 python sqlalchemy

设置简单,

我有一个简单的 Task 对象,如下所示:

# -*- coding: utf-8 -*-
from sqlalchemy import Column, Integer, String, Text, DateTime, Float, func, ARRAY,ForeignKey
from sqlalchemy.orm import relationship
from . import Base
import settings
import config.customer
import datetime

class Task(Base):
    __tablename__ = "task"

    id = Column(Integer, primary_key=True)
    value = Column(Integer)

    def __init__(self, value):
        self.value = value

    @classmethod
    def get_fake_task(cls):
        return Task(10)

然后,我试图将一个实例添加到数据库并在 session 外使用它,由于某些原因,它不起作用。

# -*- coding: utf-8 -*-
import config
import config.customer
import config.task
import datetime

#config.Base.metadata.create_all(config.engine)


FAKE_TASK = config.task.Task.get_fake_task()


session1 = config.create_session()
session1.add(FAKE_TASK)
session1.commit()
session1.close()

session2 = config.create_session()
session2.add(FAKE_TASK)
session2.refresh(FAKE_TASK)
FAKE_TASK.value = 999999
print(FAKE_TASK.id)
session2.merge(FAKE_TASK)
session2.commit()
session2.expunge_all()
session2.close()



print(FAKE_TASK.value)

这是一个非常简单的设置,在我的其他项目中,我没有遇到这样的问题。也许我在其他地方做错了?

使用上面的脚本,当我尝试在最后打印值时出现以下错误:

sqlalchemy.orm.exc.DetachedInstanceError: Instance is not bound to a Session; attribute refresh operation cannot proceed

这是配置模块中__init__.py 文件中Base 和engine 的声明:

from sqlalchemy.engine.url import URL
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
import settings
from contextlib import contextmanager

Base = declarative_base()
engine = create_engine(URL(**settings.DATABASE), pool_size=0, max_overflow=-1)
Session = sessionmaker(bind=engine)

def create_session():
    session = Session()
    return session

谢谢你的帮助

最佳答案

expire_on_commit=假

sessionmaker 需要

以避免提交后对象过期。 在访问属性之前需要从数据库中刷新过期对象,因此它需要在 session 范围内。 在不使其过期的情况下,您可以访问 session 范围之外的属性。

Session = sessionmaker(bind=engine,expire_on_commit=False)

关于python - Sqlalchemy session ,删除似乎不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47917101/

相关文章:

python - 类型错误:不支持的操作数类型/: 'str' 和 'int'

python - 属性错误 : 'HTTPHeaderDict' object has no attribute 'get_all' while mapping the mappings in elasticsearch

postgresql - SQLAlchemy Core - 生成 PostgreSQL SUBSTRING 表达式?

python - 在 amazon/aws-cli docker 镜像上安装 python 3.9

python - flask-restful 和 flask 中命名空间和蓝图的区别

python - 如何动态地将数据传递到 scipy.stats Levene 的测试函数?

python - 如何从同一列中获取所有值?

python - 一般删除所有字符串字段的空格 - SQLAlchemy

python - sqlalchemy 中的 RIGHT() 函数

python - SQLAlchemy 一个映射类中的多个外键到同一个主键