python3.3操作MySQLデータベース

2381 ワード

python 3を使用しています.3 MySQLデータベースを操作する时、振り回すのは比较的に残酷で、幸いにも大神の提点を通じて解决しました.
一部のデータは、Webページ全体をHTMLでデータベースに存在し、それらを取り出して洗浄して別のデータベースに保存する必要があります.このとき、次のような問題が発生しました.データ量が大きいので、データが小さいときはfetchallをまっすぐにしてからデータを修正してデータベースに保存することができますが、データ量が大きいときはだめです.何回か実験して、毎回90000+の時に切ってしまいました.出た間違いはGoogleでは見つかりません.not enough parameters for SQL statement、前の90000+のデータでもいいのに、急に使えなくなりました.鬱陶しい.2.この方法が使えない以上、fetchmanyで少し取って、少し処理して、データベースに保存して、スピードが遅くて、できるでしょう.しかし、問題がまた来た.まずカーソルcursor、データベース内のカーソルはメモリで開かれた領域であり、SQL結果にバインドされています.クエリー操作を先に実行し、途中で挿入操作を実行すると、前のクエリー操作に戻って実行できないことは明らかです.挿入操作のためにcursorを再定義します.これでは十分ではありません.クエリー文を実行した後、データを読み込まないと、挿入と更新操作を実行するときにunread result foundに未読結果があることがプロンプトされます.この問題を解決する方法stackflowでcursorを定義するときにbuffered = Trueを設定すると、データは直接bufferに読み出されます.
このように振り回されてやっとこの問題を解決した.最大の収穫は、cursor、カーソルを理解し、その名の通りポインタや参照として理解できることです.これにより、あるSQL文が完全に処理されずに別のSQLを実行するときに、さまざまな奇妙なエラーが発生する理由が理解できます.例えば、
query_result = cursor.fetchmany(5)
    while query_result:
        param = []
        for row in query_result:
            row = list(row)
            user = row[3].decode().split("_", 1)
            row[5] = clear_data(row[5].decode())
            data = row[0:3] + user + row[4:]
            param.append(data)
        #print(param)
        try:
            cursor.executemany(insert_data, param)
            con.commit()
        except mysql.connector.Error as connect_err:
            print("mysql Error(1):{}".format(connect_err.msg))
        query_result = cursor.fetchmany(5)

上記のコードの12行目は,クエリ文の実行後に挿入文をジャンプして実行し,16行目にクエリ文を実行することであるが,この過程でcursorのオブジェクトが変化し,次の1行目で取得した5つのデータの6条目で再取得することは不可能であることは明らかである.cursorオブジェクトが実行するSQL文が完全に乱れているので、6行目の挿入操作に新しいカーソルを再定義するのが最善です.