データベースの操作でPythonの差クライアント
PythonとMySQLのソースのオペレーティングMySQLを使用して、日常の使用mysqlクライアント操作では、彼らは置くために矛盾があります:
mysqlクライアントでは、実行するか、DELETEなどのコマンドを実行するかどうかを選択し、あなたがコミットする必要はありません。しかし、私たちが多いの書き込みのpythonコードconn.commit()コードなど
、使用しますが、SQL言語の例外をキャッチした場合、我々は、多くの場合、Pythonのコードの実行を持って、mysqlクライアントでは、我々は多くの場合、ロールバックコマンドが、コマンドラインで直接ロールバックされていないようだと言っても、削除されたデータを削除conn.rollback()ロールバック・コード。
両者の違いのためのパケット解析根本的な理由から、第二に、
違いの理由は、サーバーによって引き起こされることができないので、まず、クライアントとサーバーのオペレーティング・Pythonコードは同じであり、第二に、彼はのみ送信するサーバーの観点から受け取ることができます:まず、我々は2つのことをクリアする必要がありますパケット、そして私たちは、このパケットは、クライアントやPythonて送信によって送信されたことを知ることができません。
それが理由は、クライアントとのpythonであるので、そこにデータベースの動作の違いであり、唯一のサーバーにクライアントにすることができ、Pythonは原因の異なるデータパケットを作りました。
2.1環境の準備
私たちは、クライアントのレコードIDが0である、削除するために使用された2つのレコードを以下の現行の表は、Pythonのコードが送信された2つのデータパケットの間に違いを見るために、レコードIDを削除します。
2.2場合は、クライアント側の対話削除データパケット
クライアント:ワークベンチ。
注:また、Windowsは、直接mysql.exe使用するMySQLのインストールが、サーバーおよびログデータベースへのsshに、このパッケージだけでキャッチされるのsshパケットは、元のMySQLプロトコルパケットを見つけることができないことができないように注意してくださいすることができます。
次のようにパケットの相互作用があります。クライアントは、サーバに直接削除成功に削除コマンドを送信します。
2.3 Pythonのデータ交換プロセスを削除
次のようにテストコードがあります:
輸入pymysql デフ INIT_DB(ホスト= " 192.168.220.128 "、ユーザー= " ルート"は、passwd = " toor "、DB = " TEST_DB "、文字コード= " UTF8 " ): 試してみる: CONN = pymysql.connect(ホスト、ユーザー、 passwdを、DB、文字セット= 文字セット) を除くEとして例外: プリント(e)の 出口( 1 ) リターンCONN DEF delete_record(CONN): カーソル =conn.cursor() SQL = " ID = 1 test_table1から削除" cursor.execute(SQL)を 試してください: conn.commit() を除く: conn.rollback() CONN = INIT_DB() delete_record(CONN)
次のようにパケットの相互作用があります。まず、データベースを接続する場合、フレームがサーバに「SET AUTOCOMMIT = 0」コマンドを自動的に送信されます
その後、次のpython側と同様に、クライアントを削除するためのコマンドを送信します。
最後に、サーバーを与えることはコミットPythonでコマンドを「COMMIT」が送られます。
2.4概要
2つのサブセクション上記の集計データ。次のようにクライアントがコマンドを送信します。
削除 から test_table1 ID = 0
Pythonコード送信コマンドは次のよう:
SETの AUTOCOMMIT = 0 削除 から test_table1 ID = 0がCOMMIT
很容易可以得出结论:python代码之所以相较客户端需要commit,是因为python在连接数据库时禁用了自动确认(SET AUTOCOMMIT = 0)。
另外我们不难得到一个推论:如果客户端登录后,用户敲击“SET AUTOCOMMIT = 0”,那么其后续在客户端中对服务端的修改操作,将和python代码一样需要COMMIT、及如果删完数据想反悔将可以ROLLBACK。