0

わかりましたので、プラグインからの入力に基づいて sqlite データベース内の特定の行を選択する関数があります。1つのステートメントだけで行を選択してフェッチするプラグインを取得しましたが、これに柔軟性を追加したいので、リストまたはタプルに遭遇したときに関数がexecutemanyを使用するようにしてみました。それでも、いじって変更したすべてのものにもかかわらず、SQLite ステートメントが文字列内の各文字をバインディングとして扱っているか、タプルにバインディングが多すぎるため、これを機能させることができません。これまでのコードは次のとおりです。

    def readoffset(self,offset):
        vartype = type(name)
        print(vartype)
        if vartype == int:
            self.memcursor.execute('''select all id,matbefore,matafter,name,date 
                                   from main as main where id = ?''',[offset])
            undolist = self.memcursor.fetchall()
            print(undolist)
            return(undolist)
        elif vartype == tuple or list:
            print(vartype)
            self.memcursor.executemany('''select all id,matbefore,matafter,name,date 
                                       from main as main where name = (?)''', [offset])
            undolist = self.memcursor.fetchall()
            return(undolist)
4

2 に答える 2

5

http://www.python.org/dev/peps/pep-0249/を見てください

1つ以上の結果セットを生成する操作にこのメソッドを使用すると、未定義の動作が構成され、実装が許可されます。

したがって、executemanyはINSERTとUPDATEには使用できますが、SELECTには使用できません。

次のコードを試すことができます:

elif isinstance(offset, (tuple, list)):
    offsets=', '.join(offset)
    self.memcursor.execute('''select all id,matbefore,matafter,name,date 
                                       from main as main where name IN (?)''', [offsets])
于 2010-11-04T20:50:41.927 に答える
3

あなたがここにいる必要はないと思いますexecutemany
代わりに次のようにしてみてください。

self.memcursor.execute('''SELECT id, matbefore, matafter, name, date 
                            FROM main 
                           WHERE name IN (%s)''' % 
                       ','.join('?'*len(offset)), (offset,))

複数のプレースホルダーをクエリに配置するために、文字列の補間が行われることに注意してください。

于 2010-11-04T20:43:06.443 に答える