【问题标题】:How to edit the contents of a specific row in Python SQLite3 using ROWID如何使用 ROWID 在 Python SQLite3 中编辑特定行的内容
【发布时间】:2018-02-28 20:41:02
【问题描述】:

我有以下数据库(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()

尝试运行代码时出现以下错误:

Traceback(最近一次调用最后一次): 文件“C:\Users\Bob\Documents\Eclipse Workspace\Python Test\SQLite3\SQLite3-3.py”,第 19 行,在 值 (?,?,?,?) 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),任何帮助将不胜感激。

【问题讨论】:

    标签: python sqlite sql-update sql-insert


    【解决方案1】:

    INSERT 总是添加一个new 行,使用INSERT 时不能使用WHERE 子句。所以是的,你必须在这里使用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)
    

    【讨论】:

    • 非常感谢,这很有意义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    • 1970-01-01
    • 2017-09-24
    • 1970-01-01
    相关资源
    最近更新 更多