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 模块将在执行该命令之前隐式提交。这样做有两个原因。首先是其中一些命令在事务中不起作用。另一个原因是 sqlite3 需要跟踪事务状态(如果事务处于活动状态)。

您可以通过 connect() 调用的isolation_level 参数或连接的isolation_level 属性来控制sqlite3 隐式执行(或根本不执行)哪种BEGIN 语句。

如果您想要自动提交模式,则将isolation_level 设置为None。

否则将其保留为默认值,这将产生一个简单的“BEGIN”语句,或者将其设置为 SQLite 支持的隔离级别之一:“DEFERRED”、“IMMEDIATE”或“EXCLUSIVE”。

于 2012-08-23T02:10:13.833 回答