2017-03-20 27 views
0

私はpsycopg2(バージョン2.7.1)でpythonからpostgresを使用しようとしましたが、そうすることができませんでした。私がIN文のPython/psycopg2 SELECT WHERE内のエラー

dbase=# select * from table where id in (1,2,3,4,5,6,7); 

に使用しようとしているので、しかし、パイソンとしようとしたとき、および関連の質問を検討した後、私は、この試みでコモをアップしました 私はテーブルから特定のIDを取得する必要があります。

私はこれしようとした場合:

query = ''' 
...:   SELECT * FROM table WHERE id IN (1,2,3,4,5) 
...: ''' 

を私が手:

In [71]: cursor.execute(query) 
    -------------------------------------------------------------------- 
    InternalError      Traceback (most recent call last) 
    <ipython-input-71-2e97bea5433e> in <module>() 
    ----> 1 cursor.execute(query) 

InternalError: current transaction is aborted, commands ignored until end of transaction block 

代わりに私がIDの希望を維持するために変数を使用してみた場合:

In [87]: query = ''' 
    ...:   SELECT * FROM table WHERE id IN %s 
    ...: ''' 

In [88]: datos = "(1,2,3,4,5,6,7)" 

In [89]: cursor.execute(query,(datos,)) 
-------------------------------------------------------------------- 
ProgrammingError     Traceback (most recent call last) 
<ipython-input-89-4be5e55885c7> in <module>() 
----> 1 cursor.execute(query,(datos,)) 

ProgrammingError: syntax error at or near "'(1,2,3,4,5,6,7)'" 
LINE 2:   SELECT * FROM demanda WHERE id IN '(1,2,3,4,5,6,7)' 

フォーマットされたクエリは思わ私が望むものに近づけるために、なぜ単一のアポストロフィが置かれているのか理解できません。なぜならpsqlは認識しないからですD彼らに

おかげ

答えて

0

datosタプルを行います

datos = (1,2,3,4,5,6,7) 
0

エラー

InternalError: current transaction is aborted 

があなたの声明によって引き起こされますが、エラーで接続を残した前のエラーからされていません状態。

あなたの最初の試みは正しかった、第2の問題は間違っています。

>>> query = '''SELECT * FROM table WHERE id IN %s''' 
>>> datos = (1,2,3,4,5,6,7) 
>>> cursor.execute(query, (datos,)) 

タプルが空の場合、これはSQLエラー(psycopgフォルトではありません)を発生させることに注意してください。リストとANY演算子を使用する方がより堅牢なソリューションです。

>>> query = '''SELECT * FROM table WHERE id = any (%s)''' 
>>> datos = [1,2,3,4,5,6,7] 
>>> cursor.execute(query, (datos,))