web-dev-qa-db-ja.com

Python:cursor.execute( "SELECT ...)の影響を受ける行の数

影響を受ける行数にアクセスするにはどうすればよいですか:

cursor.execute("SELECT COUNT(*) from result where server_state='2' AND name LIKE '"+digest+"_"+charset+"_%'")
47
Tie-fighter

fetchoneを使用してみてください:

_cursor.execute("SELECT COUNT(*) from result where server_state='2' AND name LIKE '"+digest+"_"+charset+"_%'")
result=cursor.fetchone()
_

resultは、COUNT(*)の値である1つの要素を持つタプルを保持します。したがって、行数を見つけるには:

_number_of_rows=result[0]
_

または、一気にそれをやりたい場合:

_cursor.execute("SELECT COUNT(*) from result where server_state='2' AND name LIKE '"+digest+"_"+charset+"_%'")
(number_of_rows,)=cursor.fetchone()
_

PS。また、必要に応じて引数を自動的に引用し、SQLインジェクションから保護できるため、可能な場合はパラメーター化された引数を使用することもお勧めします。

パラメーター化された引数の正しい構文は、Python /データベースアダプター(mysqldb、psycopg2、sqlite3など)によって異なります。それは次のようになります

_cursor.execute("SELECT COUNT(*) from result where server_state= %s AND name LIKE %s",[2,digest+"_"+charset+"_%"])
(number_of_rows,)=cursor.fetchone()
_
66
unutbu

PEP 249 から、これは通常PythonデータベースAPIによって実装されます:

カーソルオブジェクトは、次のメソッドと属性に応答する必要があります。

[…]

_.rowcount_

しかし、注意してください-それは言い続ける:

属性は、カーソルで .execute*() が実行されていない場合、または最後の操作の行カウントがインターフェイスで判断できない場合、-1です。 [7]

注:
DB API仕様の将来のバージョンでは、オブジェクトが-1ではなくNoneを返すように、後者の場合を再定義できます。

したがって、ステートメントを実行した場合、andそれが機能し、andコードに対して常に実行されることを確信しています同じDBMSの同じバージョン、これは合理的なソリューションです。

87
AndiDog

影響を受ける行の数は、executeから返されます。

rows_affected=cursor.execute("SELECT ... ")

もちろん、AndiDogで既に述べたように、カーソルのrowcountプロパティにいつでもアクセスして、最後の実行のカウントを取得することにより、行カウントを取得できます。

cursor.execute("SELECT ... ")
rows_affected=cursor.rowcount

python MySQLdbのインラインドキュメントから:

 def execute(self, query, args=None):

    """Execute a query.

    query -- string, query to execute on server
    args -- optional sequence or mapping, parameters to use with query.

    Note: If args is a sequence, then %s must be used as the
    parameter placeholder in the query. If a mapping is used,
    %(key)s must be used as the placeholder.

    Returns long integer rows affected, if any

    """
36
Boaz

私の意見では、選択した行の量を取得する最も簡単な方法は次のとおりです。

カーソルオブジェクトは、フェッチコマンド(fetchall()、fetchone()、fetchmany())を使用すると、結果のリストを返します。選択した行を取得するには、このリストの長さを印刷します。しかし、fetchall()には意味があります。 ;-)

例:

print len(cursor.fetchall) 
16
harvey_c