sql >> データベース >  >> RDS >> Mysql

Pymysql Cursor.fetchall()/ Fetchone()はなしを返します

    PyMySQLは、MySQLデータベースに接続できるPythonライブラリです。しかし、最近、PyMySQLを介してselect SQLコマンドを実行すると、実行によってデータベーステーブルからレコードが返されないことがわかりましたが、データは実際にはデータベーステーブルに存在します。また、データベースでSQLコマンドを直接実行すると、SQLが正常に実行され、テーブルデータが正しく返されます。以下は私の場合に見つけた理由です。

    1。 SQLコマンドの目的を選択します。

    以下のSQLコマンドの目的は、user_nameが'jerry'である既存のレコードのカウント数を返すことです。カウント数が0より大きい場合、つまり条件付きのレコードがデータベーステーブルに存在する場合、コードは挿入されません。 MySQLデータベーステーブルへの新しいレコード。ただし、返されたカウント数が0の場合、つまりデータがテーブルに存在しない場合は、MySQLデータベーステーブルに挿入できます。

    "select count(id) as count from dev2qa_example.user_account where lower(user_name) = 'jerry'"

    2。上記のSQLを実行する方法はPyMySQLを使用します。

    2.1PyMySQLライブラリをインストールします。

    PyMySQLを使用して上記のSQLを実行する場合は、最初に以下のようにPyMySQLライブラリをインストールする必要があります。

    :~$ pip3 install PyMySQL
    Collecting PyMySQL
      Downloading https://files.pythonhosted.org/packages/ed/39/15045ae46f2a123019aa968dfcba0396c161c20f855f11dea6796bcaae95/PyMySQL-0.9.3-py2.py3-none-any.whl (47kB)
        100% |████████████████████████████████| 51kB 152kB/s 
    Installing collected packages: PyMySQL
    Successfully installed PyMySQL-0.9.3
    [email protected]:~$ pip3 show PyMySQL
    Name: PyMySQL
    Version: 0.9.3
    Summary: Pure Python MySQL Driver
    Home-page: https://github.com/PyMySQL/PyMySQL/
    Author: yutaka.matsubara
    Author-email: [email protected]
    License: "MIT"
    Location: /home/zhaosong/.local/lib/python3.6/site-packages
    Requires: 
    

    2.2SQLの実行PyMySQLを使用します。

    次に、PyMySQLモジュールをインポートします接続カーソル Pythonコードにクラス分けし、それを使用して上記のselectSQLコマンドを実行します。以下のソースコードをご覧いただけます。

    # import pymysql connect and cursors class.
    from pymysql import connect, cursors
    
    # get mysql connection object.
    conn = connect(host='127.0.0.1', user='root', password='root', db='dev2qa_example', charset='utf8', cursorclass=cursors.DictCursor)
    
    try:
        # get database cursor object.
        with conn.cursor() as cursor:
             # execute select sql command.
             row_count = cursor.execute(sql)
             print('select return row count = ' + str(row_count))
             # get the execution result and print it out.
             row = cursor.fetchall()
             print(row)
    finally:
       # do not forget close mysql connection at the end of the code.
       conn.close()

    上記のPythonソースコードを実行すると、なしが表示されます。 実行結果から。ソースコードをデバッグするときに、 cursor.fetchall()を追加するとわかります。 日食でPyDev cursor.fetchall()の前のデバッグウィンドウ が呼び出されると、 row_countが表示されます。 valueは、の正しい結果値(1)です。 値の列。ただし、引き続きcursor.fetchall()を実行すると 関数の場合、返される結果は空のリストです。

    そして、 row_count = cursor.execute(sql)によって返される行数 コードは、user_nameが「jerry」であるレコードカウント数でもありません。 user_nameが「jerry」であるレコードが2つ以上ある場合は、実行で返される行数だけです。 row_count = cursor.execute(sql) まだ1です。

    調査の結果、この問題は以下のシナリオに存在することがわかりました。

    1. 上記のコードをデバッグする場合にのみ存在し、上記のコードを直接実行すると、結果は正しくなります。
    2. cursor.fetchall()の理解が不足している 関数の場合、関数は呼び出された後、最後の行に移動します。そして、結果は一時変数の行に保存されます。
    3. StackOverflowのトピックで言及されているように、これはPyMySQLまたはMySQLのバグです。

    他の理由を見つけた場合は、この記事にコメントを追加してください。どうもありがとうございました。


    1. PostgreSQL:Unixエポックから現在までに変換する方法は?

    2. SQL SERVER – SQL_NO_CACHEおよびOPTION(RECOMPILE)

    3. 累積合計を取得する方法

    4. ソケットエラーから読み取るデータはもうありません