Python Can';t更新数据库的第二行
我已经做了一个程序来编辑数据库,从TkinterGUI的条目中获取输入。我成功地用下面给出的代码更新了第一行,但我不知道如何转到第二行进行更新 我之所以使用Python Can';t更新数据库的第二行,python,sqlite,loops,Python,Sqlite,Loops,我已经做了一个程序来编辑数据库,从TkinterGUI的条目中获取输入。我成功地用下面给出的代码更新了第一行,但我不知道如何转到第二行进行更新 我之所以使用range((len(names)-1)是因为我不想更新ID 代码: 提前感谢您需要一个内部循环来迭代数据 for i in range((len(names)-1)): for d in data: conn.execute("UPDATE LIBRARY set "+ names[1+i] +"= ? where " + na
range((len(names)-1)
是因为我不想更新ID
代码:
提前感谢您需要一个内部循环来迭代
数据
for i in range((len(names)-1)):
for d in data:
conn.execute("UPDATE LIBRARY set "+ names[1+i] +"= ? where " + names[0] +" = ?", (str(d[1+i]),str(d[0])))
conn.commit
但这很复杂,每个字段都需要单独更新
通过重新构造数据,许多问题都可以变得更简单。使用由ID键入的dict,将更容易、更快、更不容易出错
updates = {
2217: { 'NAME': 'ARJ', 'CLASS': '10A', 'BOOK': 'NONE', 'RETURN': 'NONE' },
2216: { 'NAME': 'JOHN', 'CLASS': '10A', 'BOOK': 'NONE', 'RETURN': 'NONE' }
}
for id, update in updates.items():
# update library set ID = ?, NAME = ?, ... where id = ?
sql = "update library set "
sql += ", ".join("{} = ?".format(key) for key in update)
sql += " where id = ?"
conn.execute(sql, (update.values(), id))
# Unless you have need to commit immediately, for efficiency,
# commit once all the updates are complete.
conn.commit
考虑同一查询中的多个列更新,并在
SET
子句中使用单独的赋值。此外,首先生成准备好的SQL语句,然后调用executemany
,但将ID移到末尾,以便与参数位置对齐:
names = ['ID', 'NAME', 'CLASS', 'BOOK', 'RETURN']
sql = "UPDATE [LIBRARY] SET {0}{1} WHERE {2} = ?".format(" = ?, ".join(names), " = ?", names[0])
print(sql)
# UPDATE [LIBRARY] SET ID = ?, NAME = ?, CLASS = ?, BOOK = ?, RETURN = ? WHERE ID = ?
initial = [2211, 2213]
nested_initial = [(i,) for i in initial]
data = [(2217, 'ARJ', '10A', 'NONE', 'NONE'), (2216, 'JOHN', '10A', 'NONE', 'NONE')]
data = [[d[0]]+list(d)[1:]+list(i) for d,i in zip(data, nested_initial)]
print(data)
# [[2217, 'ARJ', '10A', 'NONE', 'NONE', 2211], [2216, 'JOHN', '10A', 'NONE', 'NONE', 2213]]
conn.executemany(sql, data)
conn.commit()
只要将
[1:]
从列表中删除,因为它将列表中的第一项ID
子集。我希望这两个值initial=[2211223]
代替d[0]。我尝试了data=[list(d)+[initial[d]]来表示数据中的d]
但在列表理解中使用zip
给了我一个错误,请参阅更新的答案。
names = ['ID', 'NAME', 'CLASS', 'BOOK', 'RETURN']
sql = "UPDATE [LIBRARY] SET {0}{1} WHERE {2} = ?".format(" = ?, ".join(names), " = ?", names[0])
print(sql)
# UPDATE [LIBRARY] SET ID = ?, NAME = ?, CLASS = ?, BOOK = ?, RETURN = ? WHERE ID = ?
initial = [2211, 2213]
nested_initial = [(i,) for i in initial]
data = [(2217, 'ARJ', '10A', 'NONE', 'NONE'), (2216, 'JOHN', '10A', 'NONE', 'NONE')]
data = [[d[0]]+list(d)[1:]+list(i) for d,i in zip(data, nested_initial)]
print(data)
# [[2217, 'ARJ', '10A', 'NONE', 'NONE', 2211], [2216, 'JOHN', '10A', 'NONE', 'NONE', 2213]]
conn.executemany(sql, data)
conn.commit()