django数据库插入没有被拾取

时间:2014-05-16 21:35:15

标签: python mysql django django-models transactions

我们有一些复杂的设置:

在我们的普通代码中,我们手动连接到mysql数据库。我们这样做是因为我猜django通常使用的连接不是线程安全的吗?所以我们让django建立连接,从中提取信息,然后使用mysqldb连接进行实际的查询。

我们的代码主要是一个更新过程,因此我们关闭了自动提交以节省时间。

为了便于创建测试数据,我创建了表示表的django模型,并使用它们创建要测试的行。所以我的功能如下:

def make_thing(**overrides):
    fields = deepcopy(DEFAULT_THING)
    fields.update(overrides)
    s = Thing(**fields)
    s.save()
    transaction.commit(using='ourdb')
    reset_queries()
    return s

然而,它似乎并没有实际提交!在我创建一个对象后,我后来有代码对mysqldb连接执行原始sql:

def get_information(self, value):
    print self.api.rawSql("select count(*) from thing")[0][0]
    query = 'select info from thing where column = %s' % value
    return self.api.rawSql(query)[0][0]

此打印语句打印0!为什么呢?

另外,如果我关闭自动提交,我会得到 TransactionManagementError: This is forbidden when an 'atomic' block is active.

当我们稍后尝试更改自动提交级别时。

编辑:我也尝试了https://groups.google.com/forum/#!topic/django-users/4lzsQAWYwG0,但没有帮助。

EDIT2:我从shell检查数据库 - 提交 正在工作,它只是没有被提起。我已经尝试设置事务隔离级别,但它没有帮助。我应该补充说,get_information中的一个函数使用了这个装饰器:

def single_transaction(fn):
    from django.db import transaction
    from django.db import connection

    def wrapper(*args, **kwargs):
        prior_autocommit = transaction.get_autocommit()
        transaction.set_autocommit(False)
        connection.cursor().execute('set transaction isolation level read committed')
        connection.cursor().execute("SELECT @@session.tx_isolation")
        try:
            result = fn(*args, **kwargs)
            transaction.commit()
            return result

        finally:
            transaction.set_autocommit(prior_autocommit)
            django.db.reset_queries()
            gc.collect()

    wrapper.__name__ = fn.__name__
    return wrapper

0 个答案:

没有答案