Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Can';t更新数据库的第二行_Python_Sqlite_Loops - Fatal编程技术网

Python Can';t更新数据库的第二行

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

我已经做了一个程序来编辑数据库,从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 " + 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()