sqlalchemy.exc.InvalidRequestError: 对象 '<Item at 0x111ff8640>' 已经附加到会话 '5'这是 '4'

问题描述

简介

我正在尝试在表中植入数据以进行测试。为此,我使用了工厂男孩包。

我已经建立了一个处理种子的工厂类。

isChecked

问题

在测试中,我运行以下代码来创建订单。

class OrderItemFactory(factory.alchemy.sqlAlchemyModelFactory):
    id = factory.Sequence(lambda n: n)

    orders = factory.SubFactory(
        'testsuite.database.factories.OrderFactory.OrderFactory')
    items = factory.SubFactory(
        'testsuite.database.factories.ItemFactory.ItemFactory')

    class Meta:
        model = OrderItem
        sqlalchemy_session_persistence = 'commit'

但是,如果我要手动创建一行,一切正常。

    # create order
    order = OrderFactory.create()
    item = session.query(Item).\
        filter(Item.id == 1).\
        first()

    orderItem = OrderItemFactory.create(
        orders=order,items=item
    )

解决方法

我认为问题来自您使用的 SQLAlchemy 会话。

使用SQLAlchemy,每个对象都属于一个“会话”;默认情况下, factory_boy 在创建对象时将使用新会话;您必须在 Factory.Meta 参数中设置 sqlalchemy_session


# Import the `session` value from the place you're defining it for your project
from myproject.db import session

class OrderItemFactory(factory.alchemy.SQLAlchemyModelFactory):
    class Meta:
        model = OrderItem
        sqlalchemy_session_persistence = 'commit'
        sqlaclhemy_session = session

通常,项目会为这些设置定义它们的工厂子类:

# project/testing.py
import factory

from . import db

class BaseFactory(factory.alchemy.SQLAlchemyFactory):
    class Meta:
        abstract = True
        sqlalchemy_session = db.session
        sqlalchemy_session_persistence = 'commit'


# project/orders/factories.py
import factory

from . import models
from project import testing

class OrderItemFactory(testing.BaseFactory):
    class Meta:
        model = models.OrderItem
        # sqlalchemy_session_* will be imported through the use of BaseFactory
,

如果您使用的是flask_sqlalchemy,那么您应该检查您是否插入了正确的字段,而不是数据库关系。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...