4

sqlite3 データベースにローカルに保存されたデータセットがあります。列を抽出し、いくつかの操作を実行した後、データベース列のすべての値を置き換えたいと考えています。これどうやってするの?

列の長さとリストの長さは、同じ長さであることが保証されています。新しい値でテーブルを更新したいだけです。これを一度に簡単に行う方法はありますか?

Python 2.7 の使用

追加するために編集:

myList は、dtype 'object' の numpy 配列に裏打ちされた pandas シリーズです。表の列 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.
4

1 に答える 1

8

代わりに次の.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ステートメントの場合、更新するを識別するステートメント必要であることに注意してください。フィルタなしの は、すべて行を更新します。WHEREUPDATEWHERE

データに行識別子があることを確認してください。この場合、代わりに名前付きパラメーターを使用する方が簡単な場合があります。

my_data = ({id=1, value='foo'}, {id=2, value='bar'})
cursor.executemany('UPDATE test SET myCol=:value WHERE rowId=:id', my_data)
于 2013-03-28T17:35:11.677 に答える