python - pytest/sqlalchemy 对象未绑定到会话错误
问题描述
我阅读了几篇类似我的问题的帖子,但没有发现任何相关内容。我有一个桌面应用程序,我尝试使用 pytest 执行一些测试。为此,我在 Docker 容器中运行 MySQL 服务器,并使用 sqlalchemy 构建会话以添加、更新等对象。但是我有这个错误我不知道如何解决sqlalchemy.orm.exc.DetachedInstanceError: Instance <Device at 0x7f4a38a01fd0> is not bound to a Session; attribute refresh operation cannot proceed
dspt.db.__init__.py
import os
from contextlib import contextmanager
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, scoped_session
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
user = os.environ.get('MYSQL_USER')
pwd = os.environ.get('MYSQL_PWD')
url = os.environ.get('MYSQL_URL', 'localhost')
db_url = f"mysql+pymysql://{user}:{pwd}@{url}/db?charset=utf8mb4&binary_prefix=true"
print(db_url)
engine = create_engine(db_url, encoding='utf-8')
Session = scoped_session(sessionmaker(bind=engine))
@contextmanager
def db_session():
""" Creates a SQLAlchemy session"""
session = Session()
try:
yield session
# session.commit()
except:
session.rollback()
raise
finally:
session.expunge_all()
session.close()
测试.py
import pytest
from dspt.db import db_session, Base
from dspt.db.models import Device
@pytest.fixture(scope='session')
def get_device():
return [Device(), Device(), Device()]
@pytest.fixture(scope='session')
def seed(get_device):
devices = get_device
with db_session() as session:
for d in devices:
session.add(d)
session.commit()
def test_get_device(seed, get_device):
with db_session() as session:
devices = get_device
res = session.query(Device)\
.filter(Device.serial == devices[0].serial)\
.all()
assert len(res) == 1
解决方案
推荐阅读
- php - Symfony 控制器代码
- powershell - 使用带有输入验证和 TRAP 的读取主机
- javascript - Spring 控制器返回文件(适用于 csv,不适用于图像类型或 zip)
- firebase - Firebase 云消息传递无法在 Mozilla firefox 隐身模式下运行
- elasticsearch - 范围或缺失 - ElasticSearch - 查询 DSL
- python-3.x - 循环遍历文件名列表时如何对多个图像进行 blit?
- sql - 每当其中一个步骤失败时,是否可以为 SQL 作业而不是其步骤组件安排重试?
- ruby-on-rails - Ruby on Rails:如何为请求标头创建带引号的字符串?
- json - Spark 2.0 (not 2.1) Dataset[Row] or Dataframe - 选择几列到 JSON
- database - 将参数值发送到 DataSetProvider