次の影響を受ける行数にアクセスするにはどうすればよいですか。
cursor.execute("SELECT COUNT(*) from result where server_state='2' AND name LIKE '"+digest+"_"+charset+"_%'")
通常、Python データベース API によって実装されるPEP 249から:
カーソル オブジェクトは、次のメソッドと属性に応答する必要があります。
[…]
.rowcount
この読み取り専用属性は、最後の .execute*() が生成した行数 (「select」などの DQL ステートメントの場合) または影響を受けた行数 (「update」や「insert」などの DML ステートメントの場合) を指定します。
しかし、注意してください。
.execute*()
カーソルに対して何も実行されていない場合、または最後の操作の行数がインターフェイスによって決定できない場合、属性は -1です。[7]注:
DB API 仕様の将来のバージョンでは、後者のケースを再定義して、オブジェクトNone
が -1 ではなく返されるようにする可能性があります。
したがって、ステートメントを実行して機能し、コードが常に同じ DBMS の同じバージョンに対して実行されることが確実である場合、これは合理的な解決策です。
使用してみてくださいfetchone
:
cursor.execute("SELECT COUNT(*) from result where server_state='2' AND name LIKE '"+digest+"_"+charset+"_%'")
result=cursor.fetchone()
result
の値である 1 つの要素を持つタプルを保持しますCOUNT(*)
。したがって、行数を見つけるには:
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()
影響を受けた行数は、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
"""
私の意見では、選択された行の量を取得する最も簡単な方法は次のとおりです。
カーソル オブジェクトは、フェッチ コマンド (fetchall()、fetchone()、fetchmany()) を使用すると、結果のリストを返します。選択した行を取得するには、このリストの長さを出力するだけです。しかし、それは fetchall() にとって理にかなっています。;-)
例:
print len(cursor.fetchall)