python3.3操作MySQLデータベース
2381 ワード
python 3を使用しています.3 MySQLデータベースを操作する时、振り回すのは比较的に残酷で、幸いにも大神の提点を通じて解决しました.
一部のデータは、Webページ全体をHTMLでデータベースに存在し、それらを取り出して洗浄して別のデータベースに保存する必要があります.このとき、次のような問題が発生しました.データ量が大きいので、データが小さいときは
このように振り回されてやっとこの問題を解決した.最大の収穫は、cursor、カーソルを理解し、その名の通りポインタや参照として理解できることです.これにより、あるSQL文が完全に処理されずに別のSQLを実行するときに、さまざまな奇妙なエラーが発生する理由が理解できます.例えば、
上記のコードの12行目は,クエリ文の実行後に挿入文をジャンプして実行し,16行目にクエリ文を実行することであるが,この過程でcursorのオブジェクトが変化し,次の1行目で取得した5つのデータの6条目で再取得することは不可能であることは明らかである.cursorオブジェクトが実行するSQL文が完全に乱れているので、6行目の挿入操作に新しいカーソルを再定義するのが最善です.
一部のデータは、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行目の挿入操作に新しいカーソルを再定義するのが最善です.