0

このコードを使用して ID を取得します。できます:

        db = MySQLdb.connect("localhost","root","","proyectoacademias" )

        cursor = db.cursor()

        sql = "SELECT id FROM test WHERE url=\'"
        sql = sql + self.start_urls[0]
        sql = sql + "\'"

        cursor.execute(sql)

        data = cursor.fetchone()

        for row in data:
            self.id_paper_web=str(row)

        db.close()

更新する必要がある現在の行のIDを教えてくれます...

しかし、その後、更新または挿入しようとしましたが、うまくいきません....

    def guardarDatos(self):
    db = MySQLdb.connect("localhost","root","","proyectoacademias" )

    cursor = db.cursor()

    sql = "UPDATE test SET abstract=\'"+str(self.abstracto)+"\', fecha_consulta=\'"+str(self.fecha_consulta)+"\', anio_publicacion=\'"+str(self.anio_publicacion)+"\', probabilidad="+str(self.probabilidad)+" WHERE id = "+str(self.id_paper_web)

    print "\n\n\n"+sql+"\n\n\n"
    cursor.execute(sql)      

    for i in range (len(self.nombres)):
        sql = "INSERT INTO test_autores VALUES (\'"+self.nombres.keys()[i]+"\', "+str(self.id_paper_web)+", \'"+self.instituciones[self.nombres[self.nombres.keys()[i]]]+"\', "+str((i+1))+")"
        print "\n\n\n"+sql+"\n\n\n"
        cursor.execute(sql)

    db.close()

送信したすべてのSQLクエリを印刷しましたが、問題ないようです...例外はスローされず、データベースに更新や挿入はありません...

4

1 に答える 1

3

コミットする必要があります...またはデータベースを自動コミットに設定します

db.commit()

そこにはたくさんのpy sqlite3チュートリアルがあります

デフォルトでは、sqlite3 モジュールは、データ変更言語 (DML) ステートメント (つまり、INSERT/UPDATE/DELETE/REPLACE) の前に暗黙的にトランザクションを開き、非 DML、非クエリ ステートメント (つまり、SELECT またはステートメント以外のもの) の前に暗黙的にトランザクションをコミットします。前述の)。

したがって、トランザクション内で CREATE TABLE ...、VACUUM、PRAGMA などのコマンドを発行すると、sqlite3 モジュールはそのコマンドを実行する前に暗黙的にコミットします。そうする理由は2つあります。1 つ目は、これらのコマンドの一部がトランザクション内で機能しないことです。もう 1 つの理由は、sqlite3 がトランザクションの状態を追跡する必要があるためです (トランザクションがアクティブかどうか)。

connect() 呼び出しの isolation_level パラメーター、または接続の isolation_level プロパティを介して、sqlite3 が暗黙的に実行する (またはまったく実行しない) BEGIN ステートメントの種類を制御できます。

自動コミット モードが必要な場合は、isolation_level を None に設定します。

それ以外の場合は、プレーンな「BEGIN」ステートメントになるデフォルトのままにするか、SQLite でサポートされている分離レベル「DEFERRED」、「IMMEDIATE」、または「EXCLUSIVE」のいずれかに設定します。

于 2012-08-23T02:10:13.833 に答える