4

SQLQlchemy / SQLSoup アプリケーションを継承しており、20 倍にスケーリングする必要があります。

1 つのクエリが非常に遅くなっていたので、再計算しました。ネストされたサブクエリ/派生テーブルでの MySQL のパフォーマンスが低いため、2 つの一時テーブルに分割してそれらを結合しました。

今、コードに 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 で使用されるデータベースです)。

一時テーブルを引き続き使用できるように、セッションを開いたままにするにはどうすればよいですか。それとも、この問題を引き起こしている他の何かである可能性がありますか?

4

1 に答える 1

4

OK、セッションを使用する必要があります。SQL ステートメントを次のようにラップします。

session = database.SESSION
with session.begin() : 
    database.execute("Create Temporary Table.....")
    database.execute("Create Temporary Table2.....")
于 2015-09-30T14:50:10.183 に答える