14

MySQL データベースに接続されたセロリ プロジェクトがあります。テーブルの 1 つは次のように定義されます。

class MyQueues(Base):
    __tablename__ = 'accepted_queues'

    id = sa.Column(sa.Integer, primary_key=True)
    customer = sa.Column(sa.String(length=50), nullable=False)
    accepted = sa.Column(sa.Boolean, default=True, nullable=False)
    denied = sa.Column(sa.Boolean, default=True, nullable=False)

また、私が持っている設定では

THREADS = 4

そして、私は次の関数で立ち往生していますcode.py:

def load_accepted_queues(session, mode=None):

    #make query  
    pool = session.query(MyQueues.customer, MyQueues.accepted, MyQueues.denied)

    #filter conditions    
    if (mode == 'XXX'):
        pool = pool.filter_by(accepted=1)
    elif (mode == 'YYY'):
        pool = pool.filter_by(denied=1)
    elif (mode is None):
        pool = pool.filter(\
            sa.or_(MyQueues.accepted == 1, MyQueues.denied == 1)
            )

   #generate a dictionary with data
   for i in pool: #<---------- line 90 in the error
        l.update({i.customer: {'customer': i.customer, 'accepted': i.accepted, 'denied': i.denied}})

これを実行すると、エラーが発生します。

[20130626 115343] Traceback (most recent call last):
  File "/home/me/code/processing/helpers.py", line 129, in wrapper
    ret_value = func(session, *args, **kwargs)
  File "/home/me/code/processing/test.py", line 90, in load_accepted_queues
    for i in pool: #generate a dictionary with data
  File "/home/me/envs/me/local/lib/python2.7/site-packages/sqlalchemy/orm/query.py", line 2341, in instances
    fetch = cursor.fetchall()
  File "/home/me/envs/me/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 3205, in fetchall
    l = self.process_rows(self._fetchall_impl())
  File "/home/me/envs/me/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 3174, in _fetchall_impl
    self._non_result()
  File "/home/me/envs/me/local/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 3179, in _non_result
    "This result object does not return rows. "
ResourceClosedError: This result object does not return rows. It has been closed automatically

だから主にそれはその部分です

ResourceClosedError: This result object does not return rows. It has been closed automatically

時にはこのエラーも:

DBAPIError: (エラー) (, AssertionError('結果の長さが要求されていません長さ:\nExpected=1.Actual=0.位置: 21.データの長さ: 21',)) 、accepted_queues.denied AS accept_queues_denied \naccepted_queues から \nWHERE Accepted_queues.accepted = %s OR Accepted_queues.denied = %s' (1, 1)

大量のデータを処理するときに通常発生するエラーを適切に再現できません。に変更しようとするTHREADS = 41、エラーが消えました。とにかく、保持するスレッドの数が必要なため、解決策ではありません4

また、使用する必要性について混乱しています

for i in pool: #<---------- line 90 in the error

また

for i in pool.all(): #<---------- line 90 in the error

そしてそれについての適切な説明を見つけることができませんでした。

まとめ: これらの問題をスキップするためのアドバイスはありますか?

4

3 に答える 3

2

SQL-Serverを使用してプロシージャへのクエリを作成しているときに、同じエラーが発生しましたSQLAlchemy。私の場合、ストアドプロシージャに追加SET NOCOUNT ONすると問題が解決しました。

ALTER PROCEDURE your_procedure_name
AS
BEGIN

    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for your procedure here
    SELECT *
    FROM your_table_name;

END;

詳しくはこちらの記事をご覧ください

于 2021-08-01T07:55:07.270 に答える