Как обновить весь столбец со значениями в списке, используя Sqlite3
У меня есть набор данных, хранящийся локально в базе данных sqlite3. Я извлек столбец, выполнил некоторые операции и теперь хочу заменить ВСЕ значения в столбце базы данных. Как я могу это сделать?
Длина столбца и списка гарантированно будет одинаковой длины. Я просто хочу обновить таблицу с новыми значениями. Есть ли простой способ сделать это все сразу?
Использование python 2.7
Отредактировано, чтобы добавить:
myList - это серия панд, поддерживаемая массивом dtype 'object'. Столбец таблицы 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.
1 ответ
Использовать .executemany()
метод вместо:
curr.executemany('UPDATE test SET myCol= ?', myList)
Тем не мение, myList
здесь должна быть последовательность кортежей. Если это не так, выражение генератора будет делать для создания этих кортежей:
curr.executemany('UPDATE test SET myCol= ?', ((val,) for val in myList))
Демонстрация (со вставками):
>>> 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',)]
Обратите внимание, что для 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)