代码之家  ›  专栏  ›  技术社区  ›  ShaunBach

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

  •  0
  • ShaunBach  · 技术社区  · 6 年前

    我有以下数据库(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 值(?,,?,?)其中ROWID=“”+rowToEdit),(unixVar,dateStampVar,keywordVar,valueVar) sqlite3.OperationalError:靠近“WHERE”:语法错误

    我也尝试过使用更新/设置方法,但得到了不同的错误:

    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行,in 集合(?,,?,?)其中ROWID=“”+rowToEdit),(unixVar,dateStampVar,keywordVar,valueVar) sqlite3.OperationalError:接近“(”:语法错误

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

    1 回复  |  直到 6 年前
        1
  •  2
  •   Martijn Pieters    6 年前

    INSERT 始终添加 row,您不能使用 WHERE 使用时的子句 插入 . 所以是的,你必须使用 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)