我使用此代码来检索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查询,它们似乎没问题......没有抛出异常,只是数据库中没有更新或插入......
答案 0 :(得分:3)
您必须提交...或将数据库设置为自动提交
db.commit()
很多py sqlite3教程
默认情况下,sqlite3模块在a之前隐式打开事务 数据修改语言(DML)声明(即 INSERT / UPDATE / DELETE / REPLACE),并隐式提交事务 在非DML,非查询语句之前(即除了之外的任何其他语句) 选择或上述)。
因此,如果您在事务中并发出类似CREATE的命令 TABLE ...,VACUUM,PRAGMA,sqlite3模块将隐式提交 在执行该命令之前。这样做有两个原因。 首先是其中一些命令不起作用 交易。另一个原因是sqlite3需要跟踪 事务状态(如果事务处于活动状态)。
您可以隐式控制sqlite3的哪种BEGIN语句 通过isolation_level参数执行(或根本不执行) connect()调用,或通过connections的isolation_level属性。
如果需要自动提交模式,请将isolation_level设置为None。
否则将其保留为默认值,这将导致普通 “BEGIN”语句,或将其设置为SQLite支持的隔离之一 级别:“DEFERRED”,“IMMEDIATE”或“EXCLUSIVE”。