3

私はデータベースMySQLdbを操作するために使用していMySQLます。次のルーチンを使用して、 というテーブルにデータを挿入しますurls

def insert_urls(dbconn, filenames):
    root = "<path>/"
    link = "http://<url>/"
    for f in filenames:
        filename = root + f + ".html"
        local_url = link + f + ".html"
        print(filename, local_url)
        sql = """
        INSERT INTO urls(url, filename) VALUES('%s', '%s');
        """ % (local_url, filename)
        print(sql)
        dbconn.execute_query(sql)

テーブルの宣言は次の場所にurlsあります。

def create_urls_table():

    sql = """
        CREATE TABLE IF NOT EXISTS urls (
            id INT NOT NULL AUTO_INCREMENT,
            url BLOB NOT NULL,
            filename BLOB NOT NULL,
            PRIMARY KEY(id)
        ) ENGINE=INNODB;
    """
    return sql

dbconnDbconn次のように定義されるclass のオブジェクトです。

class Dbconn:
    def __init__(self,
                 host="",
                 user="",
                 pwd="",
                 database=""):

        self.host = host
        self.user = user
        self.pwd = pwd
        self.db = database
        self.cursor = None
        self.conn = None

        try:
            self.conn = MySQLdb.connect(host=self.host,
                                        user=self.user,
                                        passwd =self.pwd,
                                        db=self.db)
            self.cursor = self.conn.cursor()
            print "Connection established"
        except MySQLdb.Error, e:
            print "An error has occurred ", e

    def execute_query(self, sql=""):
        try:
            self.cursor.execute(sql)
        except MySQLdb.Error, e:
            print "An error has occurred ", e

手順insert_urlsを実行すると、次の出力が得られます。

  INSERT INTO urls(url, filename) VALUES ('http://<url>/amazon.html','<path>/amazon.html');
  INSERT INTO urls(url, filename) VALUES('http://<url>/linkedin.html', '<path>/linkedin.html');
  INSERT INTO urls(url, filename) VALUES('http://<url>/nytimes.html', '<path>/nytimes.html');

MySQLコマンドラインから手動で挿入できました。しかし、SELECT * FROM urlsクエリを実行しても何も見つかりませんでした。2行を手動で挿入した後、次のようになりました。

mysql> select * from urls;
+----+------------------------------------------------+------------------------+
| id | url                                            | filename               |
+----+------------------------------------------------+------------------------+
| 19 | http://<url>/yelp.html                         | <path>/yelp.html       |       
| 29 | http://<url>/amazon.html                       | <path>/amazon.html     |
+----+------------------------------------------------+------------------------+

値がインクリメントされていることに注意してくださいid...データが挿入されているが、永続化されていないことを意味する場合がありますか? 誰かがそれを手伝ってくれませんか?

4

2 に答える 2

4

おそらくトランザクション データベースを使用している可能性があります。

self.conn.commit()

(実際、INNODB はトランザクション データベースです。)


あなたはに組み込むことができcommitますexecute_query

def execute_query(self, sql=""):
    try:
        self.cursor.execute(sql)
    except MySQLdb.Error as e:
        print "An error has occurred ", e
        self.conn.rollback()
    else:
        self.conn.commit()

commitただし、またはを呼び出す前に、多数のクエリを実行したい場合がありますrollback。その場合、必要に応じて削除commitexecute_queryて明示的に呼び出すか、 -suiteを終了するときにcommitコンテキスト マネージャーを使用して呼び出します。commitwith


MySQLdb接続はコンテキスト マネージャーであることに注意してください。あなたは書ける

connection = MySQLdb.connect(
    host=config.HOST, user=config.USER,
    passwd=config.PASS, db=config.MYDB, )

with connection as cursor:
    cursor.execute(...)

connection.commit()の終了時with-suite、またはconnection.rollback()例外が発生した場合、接続が呼び出されます。MySQLdb.connections.py でこれを制御するコードは次のとおりです。

def __enter__(self): return self.cursor()

def __exit__(self, exc, value, tb):
    if exc:
        self.rollback()
    else:
        self.commit()
于 2013-08-27T23:39:11.143 に答える
1

execute()ステートメントの後、次のように呼び出しcommit()ます。

self.cursor.execute(sql)
self.conn.commit()

詳細については、次を参照してください: python mysql insert data

于 2013-08-27T23:40:25.273 に答える