0

私の人生では、以下のモジュールがDBに新しい行を追加しない理由がわかりません。コマンド ライン インターフェイスを使用して追加できます。他の手段を使用して追加することもできます (つまり、コマンドをスクリプト ファイルに書き込んでを使​​用しos.system('...')ますが、 を使用するcursor.execute()と、(テーブルが作成されても) 行は追加されません)。ここでは、表示を楽しむための最小限のスクリプトを示します。このスクリプトを実行してもエラーや警告が表示されない

#!/usr/bin/env python

import MySQLdb

if __name__ == '__main__':
   db = MySQLdb.connect ( host="localhost", user="user", passwd="passwd", db="db" )
   cursor = db.cursor()

   cursor.execute ( 
   """
      CREATE TABLE IF NOT EXISTS god_i_really_hate_this_stupid_library
      (
         id            INT NOT NULL auto_increment,
         username      VARCHAR(32) NOT NULL UNIQUE,
         PRIMARY KEY(id)
      ) engine=innodb;
   """
   )

   cursor.execute ( 
   """
      INSERT INTO god_i_really_hate_this_stupid_library
      ( username )
      VALUES
      ( 'Booberry' );
   """
   )

   cursor.close()
4

2 に答える 2

2

MySQLdbのFAQから:

1.2.0 以降、MySQLdb は、DB-API 標準 (PEP-249) で必要とされるように、デフォルトで自動コミットを無効にします。InnoDB テーブルまたはその他のタイプのトランザクション テーブル タイプを使用している場合は、接続を閉じる前に connection.commit() を実行する必要があります。そうしないと、変更がデータベースに書き込まれません。

逆に、connection.rollback() を使用して、最後のコミット以降に行った変更を破棄することもできます。

重要な注意: 一部の SQL ステートメント (具体的には CREATE TABLE などの DDL ステートメント) は非トランザクションであるため、ロールバックできず、保留中のトランザクションがコミットされます。

呼び出しdb.autocommit(True)て接続の自動コミットをオンにするdb.commit()ことも、必要に応じて手動で呼び出すこともできます。

于 2012-05-28T21:11:37.727 に答える
2

接続で呼び出す必要がありcommitます。そうしないと、行われたすべての変更が自動的にロールバックされます。

于 2012-05-28T21:07:01.650 に答える