我有一个本地存储在sqlite3数据库中的数据集。我提取了一个列,执行了一些操作,现在想替换数据库列中的所有值。我怎样才能做到这一点?
列和列表的长度保证为相同的长度。我只想用新值更新表。有一种简单的方法可以一次完成所有操作吗?
使用python 2.7
编辑添加:
myList是由dtype'object'的numpy数组支持的熊猫系列。表列myCol是文本格式的。
In [1]: curr.execute('UPDATE test SET myCol= ?', myList)
---------------------------------------------------------------------------
ProgrammingError Traceback (most recent call last)
f:\python\<ipython-input-52-ea41c426502a> in <module>()
----> 1 curr.execute('UPDATE test SET myCol = ?', myList)
ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 401125 supplied.
Run Code Online (Sandbox Code Playgroud)
使用.executemany()方法代替:
curr.executemany('UPDATE test SET myCol= ?', myList)
Run Code Online (Sandbox Code Playgroud)
但是,这里myList 必须是一个元组序列。如果不是,生成器表达式将创建这些元组:
curr.executemany('UPDATE test SET myCol= ?', ((val,) for val in myList))
Run Code Online (Sandbox Code Playgroud)
演示(带插入):
>>> import sqlite3
>>> conn=sqlite3.connect(':memory:')
>>> conn.execute('CREATE TABLE test (myCol)')
<sqlite3.Cursor object at 0x10542f1f0>
>>> conn.commit()
>>> myList = ('foo', 'bar', 'spam')
>>> conn.executemany('INSERT into test values (?)', ((val,) for val in myList))
<sqlite3.Cursor object at 0x10542f180>
>>> list(conn.execute('select * from test'))
[(u'foo',), (u'bar',), (u'spam',)]
Run Code Online (Sandbox Code Playgroud)
请注意,对于一条UPDATE语句,您必须具有一条WHERE语句来标识要更新的行。一个UPDATE不带WHERE过滤器将更新所有行。
确保您的数据具有行标识符。在这种情况下,改用命名参数可能会更容易:
my_data = ({id=1, value='foo'}, {id=2, value='bar'})
cursor.executemany('UPDATE test SET myCol=:value WHERE rowId=:id', my_data)
Run Code Online (Sandbox Code Playgroud)