SQLAlchemy / SQLSoup在MySQL中无法看到临时表

4
我继承了一个SQLAlchemy/SQLSoup应用程序,需要将其扩展20倍。
其中一个查询速度非常慢,因此我进行了重构。由于MySQL在嵌套子查询/派生表上的性能较差,我将其拆分为两个临时表并连接它们。
现在我正在尝试将SQL添加到代码中,但是当我尝试访问临时表时,我会收到错误消息,指出该表不存在。
db.execute("""DROP TABLE IF  EXISTS next_requests""") ;
db.execute("""
        CREATE TEMPORARY TABLE next_requests
                (INDEX request_id_index (cirId)) 
        SELECT DISTINCT 
            cr.uuid             AS cirId,
            ....")

db.execute("SELECT * FROM next_requests")

现在我遇到了错误:

ProgrammingError: (ProgrammingError) (1146, "Table 'SAST.next_requests' (doesn't exist") 

我猜测这是因为会话在查询之间被关闭和重新打开,或者类似于那样的操作。
数据库连接如下。
ENGINE = create_engine(settings.dbString, pool_recycle=1800, pool_size=5)
SESSION = scoped_session(sessionmaker(autoflush=True,\
    expire_on_commit=False, autocommit=True))
SQLSOUP_DB = sqlsoup.SQLSoup(ENGINE, session=SESSION)

"SQLSOUP_DB是在db.execute中使用的数据库。我需要做什么来保持会话开放,以便我仍然可以使用临时表。或者可能是其他原因导致了这个问题吗?"

将其分成两部分后速度更快。问题是我需要在一个大表的一对多关系中获取最近的条目,因此我需要在选择MAX()时进行自连接。这个派生表没有被索引,所以一切都变得缓慢。我对SQL有相当好的理解,只是不熟悉SQLAlchemy。 - wobbily_col
1个回答

5

好的,我需要使用会话。将SQL语句包装如下:

session = database.SESSION
with session.begin() : 
    database.execute("Create Temporary Table.....")
    database.execute("Create Temporary Table2.....")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接