如何使用ROWID编辑Python SQLite3中特定行的内容

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用ROWID编辑Python SQLite3中特定行的内容相关的知识,希望对你有一定的参考价值。

我有以下数据库(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行,在VALUES中(?,?,?,?)WHERE ROWID =“”“+ rowToEdit),(unixVar,dateStampVar,keywordVar,valueVar)sqlite3.OperationalError:near”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:near“(”:syntax error

我只想编辑一个特定的行(使用ROWID),任何帮助将不胜感激。

答案

INSERT总是添加一个新行,使用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)

以上是关于如何使用ROWID编辑Python SQLite3中特定行的内容的主要内容,如果未能解决你的问题,请参考以下文章

Sqlite3 rowid 与 AUTOINCRENTENT

SQLite3 和 last_insert_rowid

方镁石。插入后如何获取自动增量主键的值,除了last_insert_rowid()?

如何根据rowid删除数据

如何使用带有 Python 3.7 的 sqlite3 python 模块的 FTS5 扩展?

如何使用我的 Python3 fbs 包打包 Sqlite3 数据库?