【问题标题】:SQLAlchemy / SQLSoup not seeing temporary tables in MySQLSQLAlchemy / SQLSoup 在 MySQL 中看不到临时表
【发布时间】:2015-12-15 14:04:42
【问题描述】:

我继承了一个 SQLQlchemy / 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 中使用的数据库)。

我需要做些什么来保持会话打开,以便我仍然可以使用临时表。还是可能是其他原因导致了这个问题?

【问题讨论】:

  • 我把它一分为二会更快。问题是我需要在一个大表上的一对多关系中的最新条目,所以我需要在 select MAX() 上进行自我 JOIN。这个派生表没有被索引,所以一切都很慢。我对 SQL 有很好的了解,只是对 SQLAlchemy 不太了解。

标签: python mysql sqlalchemy temp-tables sqlsoup


【解决方案1】:

好的,我必须使用会话。像这样包装 SQL 语句:

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

【讨论】:

    猜你喜欢
    • 2011-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多