У меня есть набор данных, хранящийся локально в базе данных sqlite3. Я извлек столбец, выполнил некоторые операции и теперь хочу заменить ВСЕ значения в столбце базы данных. Как я могу это сделать?
Длина столбца и списка гарантированно будет одинаковой. Я просто хочу обновить таблицу новыми значениями. Есть ли простой способ сделать это сразу?
Использование python 2.7
Отредактировано, чтобы добавить:
MyList - это серия панд, поддерживаемая массивом numpy 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)
Похожие вопросы
Связанные вопросы
Новые вопросы
python
Python — это мультипарадигмальный многоцелевой язык программирования с динамической типизацией. Он предназначен для быстрого изучения, понимания и использования, а также обеспечивает чистый и унифицированный синтаксис. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Если у вас есть вопросы о версии Python, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas, NumPy) укажите это в тегах.
row1 = myList[0], row2=myList[1]
и т. Д.executemany()
выполняет итерацию поmyList
и эффективно вызываетexecute()
для каждой записи. Однако для этого требуется, чтобы каждая записьmyList
была кортежем.WHERE
. Как вы ожидаете, что база данных узнает, чтоmyCol
принадлежит какой строке?UPDATE
для повторного сопоставления строк.