Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django数据库插入未被拾取_Python_Mysql_Django_Django Models_Transactions - Fatal编程技术网

Python django数据库插入未被拾取

Python django数据库插入未被拾取,python,mysql,django,django-models,transactions,Python,Mysql,Django,Django Models,Transactions,我们的设置有点复杂: 在我们的普通代码中,我们手动连接到mysql数据库。我们这样做是因为我想django通常使用的连接不是线程安全的?因此,我们让django建立连接,从中提取信息,然后使用mysqldb连接进行实际查询 我们的代码主要是一个更新过程,所以我们关闭了自动提交以节省时间 为了便于创建测试数据,我创建了表示表的django模型,并使用它们创建要测试的行。所以我有如下功能: def make_thing(**overrides): fields = deepcopy(DEFA

我们的设置有点复杂:

在我们的普通代码中,我们手动连接到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:当“原子”块处于活动状态时,这是禁止的。

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

编辑:我也试过了,但没用

EDIT2:我从一个shell检查了数据库——提交正在工作,只是没有被接收。我尝试过设置事务隔离级别,但没有帮助。我应该补充一点,从get_information向上的一个函数使用这个decorator:

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

必须是Mysql吗?我知道MySql不支持事务。这里有一些文章:。如果不需要mysql,请尝试使用postgres:)mysql是必需的。这是生产软件,我们不能就这样更改数据库。您可以在提交后创建mysqldb连接吗?