2017-01-16 19 views
0

私は主キーとしてテキストをインポートしたデータベースを持っています。 次に、テキストに関連するキーワード、たとえば列 "arson"を持つ列があります。これらの各列のデフォルト値は0です。forループ中にsqlite3が主キーを参照できますか?

SQLite3データベースでテキストを読み込み、特定のキーワードが存在するかどうかを確認してから、キーワード列に1の値を割り当てようとしていますテキストにはキーワードが含まれていました。

以下の例は、テキストに「Arson」という単語が含まれている行のarson列の値のみを変更しようとしています。

プログラムはテキストを読んでいて、3回印刷すると、3つのテキストに「Arson」という単語があることを示しています。しかし、私は個々の行を1で更新することはできません。私は以下のコードのいくつかのバリエーションを試しましたが、これに固執しているようです。

!# Python3 
#import sqlite3 

sqlite_file = 'C:\\Users\\xxxx\\AppData\\Local\\Programs\\Python\\Python35-32\\database.sqlite' 
conn = sqlite3.connect(sqlite_file) 
c = conn.cursor() 



texts = c.execute("SELECT texts FROM database") 
for articles in texts: 
    for words in articles: 
     try: 
      if "Arson" in words: 
       print('yes') 
       x = articles 
       c.execute("UPDATE database SET arson = 1 WHERE ID = ?" (x)) 
     except TypeError: 
      pass 

conn.commit() 
conn.close() 
+0

'c.execute( "UPDATEデータベースSET放火= ID = 1?"(X))' 'TypeError'例外を引き上げます。なぜあなたはそのエラーをキャッチしようとしていますか?あなたはあなたの構文が間違っている。 –

+0

'c.execute(" UPDATEデータベースSET arson = 1 WHERE ID =? "(x))'は、 'TypeError'例外を発生させます。なぜあなたはそのエラーをキャッチしようとしていますか?あなたはあなたの構文が間違っている。 –

+0

あなたが正しいです、私はtry except節を削除しました。それはDBのすべての列を開いていて、残りの部分はTEXTで、残りはINTEGERでした。私はそれを削除し、今はTypeErrorを取得します - 'str'オブジェクトは呼び出し可能ではありません。私は本当にこれで何をするのかわからない、私は文字列を渡して元のテキストを取得してdb:text = str(articles)sets = str(ordered_set(articles))c.execute( "INSERT OR (セット、テキスト)VALUES(?、?) "、(sets、text))forループ内の記事を参照するにはどうしたらいいですか? – DTracer

答えて

0

4時間後、私はついにこの問題を解決できました。上記のようにカンマを追加しました。しかし、コードがループ全体を正しく実行しなかったため、これにより他の問題が発生しました。これを行うには、別のカーソルオブジェクトを追加して、ループ内に2番目のカーソルを使用する必要がありました。改訂されたコードは、以下に見ることができる:

!# Python3 
import sqlite3 

sqlite_file = 'C:\\Users\\xxxx\\AppData\\Local\\Programs\\Python\\Python35-32\\database.sqlite' 
conn = sqlite3.connect(sqlite_file) 
c = conn.cursor() 
c2 = conn.cursor() 

atexts = c.execute("SELECT texts FROM database") 
for articles in atexts: 
    for words in articles: 
     if "arson" in words: 
      print('yes') 
      c2.execute("UPDATE database SET arson = 1 WHERE texts = ?", (words,)) 


conn.commit() 
conn.close() 
1

この式:あなたは関数として文字列を扱うしようとしているため、常に

c.execute("UPDATE database SET arson = 1 WHERE ID = ?" (x)) 

は、TypeErrorが発生します。あなたは基本的に"..."(argument)を実行していて、あたかも"..."が呼び出し可能であるかのようです。

あなたはSQLパラメータとしてxに渡ししようとする試みであるためには、いくつかのコンマを追加する必要があるだろう:

c.execute("UPDATE database SET arson = 1 WHERE ID = ?", (x,)) 

は、最初のコンマはc.execute()に渡された2つの引数を分離し、今あなたは合格クエリ文字列、およびパラメータの別々のシーケンス。

第2のカンマは、(..,)に1つの要素を含むタプルを作成します。カンマの意味を明確にするためには、括弧が必要ですが、そこでは重要なのはコンマです。(...)

try...except TypeErrorを削除することができます。コードがまだTypeErrorの例外を発生させている場合は、まだバグがあります。

+0

おかげで、編集時間がなくなった直後にコンマが分かりました。私はコンマでコードを更新しました。残念ながら、 "sqlite3.OperationalError:no such column:ID"というエラーはまだ出ていますが、チェックして再チェックし、arsonは自分のカラムの1つです。また、私はx値の単語で記事を交換しようとしましたが、同じ結果が得られます。 – DTracer

+0

これは以前のコメントの問題を解決しました:c.execute( "UPDATE ancast SET arson = 1 WHERE texts =?"、(x、))....別の問題が発生し、2番目の行だけが更新されています。他のものではなく、最初と最後です。私は私のループをチェックします。 – DTracer

+0

@DTracer:あなたはあなたのテーブルの列を共有していないので、私は 'ID'が正しい列名であると仮定することしかできませんでした。 'texts'が正しい列名であった場合、それを選択すると、それが問題を解決します。 –

関連する問題