我有以下数据库(test.db): Test Database
如图所示,我创建并填充了一个表(“stuffToPlot”)。
我想编辑一个特定的行(例如第5行),并更改其中的所有值。 我尝试了以下代码来执行此操作:
import sqlite3
conn = sqlite3.connect('test.db')
c = conn.cursor()
tableToEdit = 'stuffToPlot'
rowToEdit = '5'
unixVar = 5.5
dateStampVar ='feb-2018'
keywordVar = 'Hello World'
valueVar = 25
c.execute("""INSERT INTO """+tableToEdit+""" (unix, datestamp, keyword, value)
VALUES (?,?,?,?) WHERE ROWID =""" +rowToEdit),(unixVar, dateStampVar, keywordVar, valueVar)
conn.commit()
c.close()
conn.close()
尝试运行代码时出现以下错误:
追踪(最近一次通话): 文件“C:\ Users \ Bob \ Documents \ Eclipse Workspace \ Python Test \ SQLite3 \ SQLite3-3.py”,第19行,in VALUES(?,?,?,?)WHERE ROWID =“”“+ rowToEdit),(unixVar,dateStampVar,keywordVar,valueVar) sqlite3.OperationalError:靠近“WHERE”:语法错误
我也尝试过使用UPDATE / SET方法,但得到了一个不同的错误:
c.execute("""UPDATE """+tableToEdit+""" (unix, datestamp, keyword, value)
SET (?,?,?,?) WHERE ROWID =""" +rowToEdit),(unixVar, dateStampVar, keywordVar, valueVar)
文件“C:\ Users \ Shaun \ Documents \ Eclipse Workspace \ Python Test \ SQLite3 \ SQLite3-3.py”,第24行, SET(?,?,?,?)WHERE ROWID =“”“+ rowToEdit),(unixVar,dateStampVar,keywordVar,valueVar) sqlite3.OperationalError:接近“(”:语法错误
我只想编辑一个特定的行(使用ROWID),非常感谢任何帮助。
答案 0 :(得分:2)
INSERT
始终添加 new 行,使用WHERE
时不能使用INSERT
子句。所以是的,你必须在这里使用UPDATE
。但是,UPDATE
语法错误。
UPDATE
使用columname=value
对,请参阅official documentation for UPDATE
:
c.execute(
"""UPDATE {} SET unix=?, datestamp=?, keyword=?, value=?
WHERE ROWID = ?""".format(tableToEdit),
(unixVar, dateStampVar, keywordVar, valueVar, int(rowToEdit)))
我从使用串联切换到str.format()
,但只是将表名放入。ROWID
值可以作为查询参数传入,所以这样做。
演示:
>>> import sqlite3
>>> conn = sqlite3.connect(':memory:')
>>> conn.execute('''
... CREATE TABLE stuffToPlot (unix REAL, datestamp TEXT, keyword TEXT, value INTEGER)
... ''')
<sqlite3.Cursor object at 0x10f049ce0>
>>> with conn:
... for _ in range(10):
... c = conn.execute('''
... INSERT INTO stuffToPlot VALUES (42.0, "mar-2010", "The quick brown fox", 81)
... ''')
...
>>> tableToEdit = 'stuffToPlot'
>>> rowToEdit = '5'
>>> unixVar = 5.5
>>> dateStampVar ='feb-2018'
>>> keywordVar = 'Hello World'
>>> valueVar = 25
>>> with conn:
... conn.execute(
... """UPDATE {} SET unix=?, datestamp=?, keyword=?, value=?
... WHERE ROWID = ?""".format(tableToEdit),
... (unixVar, dateStampVar, keywordVar, valueVar, int(rowToEdit)))
...
<sqlite3.Cursor object at 0x10f049ce0>
>>> print(*conn.execute('SELECT * FROM stuffToPlot WHERE ROWID=5'))
(5.5, 'feb-2018', 'Hello World', 25)