SQLAlchemy / SQLSoup 在 MySQL 中看不到临时表
SQLAlchemy / SQLSoup not seeing temporary tables in MySQL
我继承了一个 SQLQlchemy / SQLSoup 应用程序,需要将其扩展 20 倍。
一个查询真的很慢,所以我重构了它。由于 MySQL 在嵌套子查询/派生 table 上的性能不佳,我将其拆分为两个临时 table 并加入它们。
现在我试图将 SQL 添加到代码中,但是当我尝试访问临时 table 时,我收到一条错误消息,指出 table 没有不存在。
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 中使用的数据库)。
我需要做什么来保持会话打开,以便我仍然可以使用临时 tables。或者可能是其他原因导致了这个问题?
好的,我必须使用会话。像这样包装 SQL 语句:
session = database.SESSION
with session.begin() :
database.execute("Create Temporary Table.....")
database.execute("Create Temporary Table2.....")
我继承了一个 SQLQlchemy / SQLSoup 应用程序,需要将其扩展 20 倍。
一个查询真的很慢,所以我重构了它。由于 MySQL 在嵌套子查询/派生 table 上的性能不佳,我将其拆分为两个临时 table 并加入它们。
现在我试图将 SQL 添加到代码中,但是当我尝试访问临时 table 时,我收到一条错误消息,指出 table 没有不存在。
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 中使用的数据库)。
我需要做什么来保持会话打开,以便我仍然可以使用临时 tables。或者可能是其他原因导致了这个问题?
好的,我必须使用会话。像这样包装 SQL 语句:
session = database.SESSION
with session.begin() :
database.execute("Create Temporary Table.....")
database.execute("Create Temporary Table2.....")