Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.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 SQLAlchemy是否在提交后重新打开会话?_Python_Mysql_Sqlalchemy - Fatal编程技术网

Python SQLAlchemy是否在提交后重新打开会话?

Python SQLAlchemy是否在提交后重新打开会话?,python,mysql,sqlalchemy,Python,Mysql,Sqlalchemy,我想知道,在调用session.commit之后,SQLAlchemy能否重新打开会话?下面的代码有时并不总是,大多数情况下没有错误给出错误ProgrammingError'ProgrammingError 1146,Table'dbname.tmp_Table'不存在。非常简单的代码,但应显示操作顺序: with create_session() as session: session.execute("DROP TEMPORARY TABLE IF EXISTS dbname.tmp

我想知道,在调用session.commit之后,SQLAlchemy能否重新打开会话?下面的代码有时并不总是,大多数情况下没有错误给出错误ProgrammingError'ProgrammingError 1146,Table'dbname.tmp_Table'不存在。非常简单的代码,但应显示操作顺序:

with create_session() as session:
    session.execute("DROP TEMPORARY TABLE IF EXISTS dbname.tmp_table")
    session.execute("CREATE TEMPORARY TABLE dbname.tmp_table (field list)")
    session.commit()
    while loop_condition is valid:
        # This line gives accidentally errors
        session.execute("INSERT INTO dbname.tmp_table (fields) SELECT ...")
        # A couple of another data manipulations on DB server
        ...
        session.execute("TRUNCATE TABLE dbname.tmp_table")
        session.commit()
    session.execute("DROP TEMPORARY TABLE IF EXISTS dbname.tmp_table")
    session.commit()

我在mysql 5.5中使用sqlalchemy,并使用mysql的临时表来缓存事务的一些聚合结果。我知道临时表只能在创建它的会话中访问。所以我唯一的建议是,SQLALchemy的会话有时会在提交后重新打开实际的MySQL会话。是否可能,或者有其他正确的解释?

您可能过于简化了代码,并在不希望的地方实例化了一个新会话。在这方面,这个例子非常好——没有人可以用该代码重新创建问题。不,我没有错过新会话的创建:这是关键——没有新会话,没有提交,除了我展示的那些,所有操作都在with子句中创建的一个会话中。我自己也无法在本地主机上重现这个问题。它只出现在生产环境中,并不像我上面提到的那样是永久性的。更多细节:整个操作大约需要15-20秒,循环中大约有18次迭代。那么,也许你有连接问题?是的,很可能是由连接问题引起的。但我没有看到关于断开连接或其他方面的错误。会话处于活动状态,它与DB服务器进行对话。通过将临时表的创建移动到一个事务中,并在while循环下进行数据操作,我已经解决了这个问题。但我为什么会犯这样的错误仍然很有趣。