66

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

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

6 に答える 6

99

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

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

[…]

.rowcount
この読み取り専用属性は、最後の .execute*() が生成した行数 (「select」などの DQL ステートメントの場合) または影響を受けた行数 (「update」や「​​insert」などの DML ステートメントの場合) を指定します。

しかし、注意してください。

.execute*()カーソルに対して何も実行されていない場合、または最後の操作の行数がインターフェイスによって決定できない場合、属性は -1です。[7]

注:
DB API 仕様の将来のバージョンでは、後者のケースを再定義して、オブジェクトNoneが -1 ではなく返されるようにする可能性があります。

したがって、ステートメントを実行て機能し、コードが常に同じ DBMS の同じバージョンに対して実行されることが確実である場合、これは合理的な解決策です。

于 2010-03-24T21:59:35.343 に答える
98

使用してみてください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()
于 2010-03-25T01:07:06.360 に答える
41

影響を受けた行数は、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

    """
于 2010-05-14T13:08:27.387 に答える
19

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

カーソル オブジェクトは、フェッチ コマンド (fetchall()、fetchone()、fetchmany()) を使用すると、結果のリストを返します。選択した行を取得するには、このリストの長さを出力するだけです。しかし、それは fetchall() にとって理にかなっています。;-)

例:

print len(cursor.fetchall) 
于 2013-11-08T08:14:09.657 に答える