Connection.commit()不会在Django测试中持久保存数据

我正在尝试测试我的db_insert()方法是否有效。

def db_insert(data,insert_query,limit=100):
    """Persist data to database
    :param data: Tuple of tuples
    :param insert_query: String
    :param limit: Integer
    """
    # Insert / Merge
    cursor = conn.cursor()
    try:
        for i in range(0,int(len(data) / limit) + 1):
            sliced_data = data[i * limit:i * limit + limit]
            if sliced_data:
                cursor.executemany(insert_query,sliced_data)
                conn.commit()
    except Exception as e:
        conn.rollback()
        raise DBException('ScriptName:db_manager.py,ErrorType:{}Impact:Unable to insert into database,'
                          'ErrorMessage:{}'.format(type(e).__name__,e))

此方法由另一种方法调用:

def insert(cls,new_list):
    """Insert new data to DB
    :param new_list: List
    """
    try:
        insert_query = "insert into TABLE {} values {}" \
            .format(tuple(cls.TABLE_ATTR[1:]),('%s',) * len(cls.TABLE_ATTR[1:]))
        insert_query = insert_query.replace('\'','')
        db_insert(new_list,insert_query)
    except Exception as e:
        logger.exception(e)

最后,insert()子类中的测试将调用TestCase方法:

def test_insert_method_success(self):
        SomeModule.insert(['text1','text2','text3',1,settings.SCRIPT_RUN_TIME])
        cursor = conn.cursor()
        cursor.execute("select * from TABLE")
        data = cursor.fetchall()
        print(data)  # [1]

[1]中的输出返回2个元组。但是,这些元组是使用models.save()中的setUp()添加到数据库中的数据。

有人可以告诉我为什么conn.commit()不能如实际运行那样将数据持久保存到数据库中吗?

yhwx_88 回答:Connection.commit()不会在Django测试中持久保存数据

您的测试失败,因为它运行在Django PASS src/stackoverflow/58820204/index.spec.tsx (9.049s) AutoComplete ✓ render list (32ms) Test Suites: 1 passed,1 total Tests: 1 passed,1 total Snapshots: 0 total Time: 10.788s 中。该类使用事务作为运行和回滚测试的机制。由于每个测试都在事务内部运行,因此任何在测试中手动管理事务的尝试(例如您的TestCaseconn.commit())都会造成严重破坏。

对于类似的测试,您应该使用conn.rollback()。它使用表截断来撤消数据库影响。速度较慢,但​​不会影响您管理交易的能力。

有关更多详细信息,请参见the documentation

  

Django的TransactionTestCase类是TestCase的更常用子类,它利用数据库事务处理工具来加快每次测试开始时将数据库重置为已知状态的过程。但是,这样做的结果是,某些数据库行为无法在Django TransactionTestCase类中进行测试。...

     

TestCase [不同于TransactionTestCase]可以调用提交和回滚,并观察这些调用对数据库的影响。

本文链接:https://www.f2er.com/3154341.html

大家都在问