2016-10-20 5 views
-1

私はSELECT value of column_2 from the sqlite3 TABLE table_name WHERE, column_3 value is 'Waiting'にしようとしています。sqlite3データベースを読むためのpythonスクリプトが失敗しています

変数として列名、table_nameおよび条件チェック値を渡したいとします。

このようなスクリプトをクラスで作成しましたが、失敗しました。

#!/usr/bin/python 
import sys 
import os 
import sqlite3 
import re 
    class Read_class(object): 
     def __init__(self,db_name,table_name,status,column_to_read,column_state): 
     self.db_name = db_name 
     self.table_name = table_name 
     self.status = status 
     self.column_to_read = column_to_read 
     self.column_state = column_state 
     def read_waiting(self): 
     db_name = self.db_name 
     column_2 = self.column_to_read 
     table_name = self.table_name 
     column_3 = self.status 
     print column_3 
     column_state = self.column_state 
     print column_state 
     conn = sqlite3.connect(db_name) 
     print "Opened database successfully"; 
     c = conn.cursor() 
     c.execute("SELECT ({coi}) FROM {tn} WHERE {cn} = {cs}".\ 
      format(coi=column_2, tn=table_name, cn=column_3,cs=column_state)) 
     conn.commit() 
     row = c.fetchall() 
     print row 
     return row 
C = Read_class('test.db', 'Test_Task', 'status', 'Task_ID','Waiting') 
task_id = C.read_waiting() 

私は、次のエラーを取得しています:DBに格納されている

[email protected]:~/auto/scripts$ python class.py 
status 
Waiting 
Opened database successfully 
Traceback (most recent call last): 
File "class.py", line 70, in <module> 
task_id = C.read_waiting() 
File "class.py", line 26, in read_waiting 
format(coi=column_2, tn=table_name, cn=column_3,cs=column_state)) 
sqlite3.OperationalError: no such column: Waiting. 

My sqlite3 db schema and data stored on the db is as follows: 
CREATE TABLE Test_Task 
      (User_Name TEXT NOT NULL, 
      User_Email varchar(20), 
      Image_Name varchar(30), 
      UGW_Tag varchar(20), 
      WAN_Mode varchar(10), 
      Test_Type varchar(20), 
      Sub_Type varchar(20), 
      Task_ID INT NOT NULL, 
      status varchar(20)); 

データ:

sqlite> SELECT * from Test_Task;   
nagesh|[email protected]|20161020134234_CSX5000.tar|Ubuntu16.04xenial|WAN|SANITY|xxxxxi|1|Running 
ramesh|[email protected]|123_wan.tar|12ertf|LAN|FULL|aqbc|2|Waiting 
vishal|[email protected]|20161020135030_CSX5000.tar|Ubuntu16.04xenial|WAN|SANITY|xxxxxi|3|Running 
ramesh|[email protected]|123_wan.tar|12ertf|LAN|FULL|aqbc|4|Waiting 

これを実現する方法を提案してください。

+0

実行するクエリを正確に指定しますか? – Harsha

+0

私はpythonスクリプトを使用して次のコマンドを実行しようとしています: sqlite> Test_TaskからのTask_IDの選択WHERE status = 'Waiting'; sqlite>ここで、Task_ID、Test_Task、status、およびWaitingを変数として渡そうとしています。 –

+0

ここにデータベースの例を入れてください。 – Yugi

答えて

0

SQLをフォーマットして印刷すると、すぐにWHERE status = Waitingが含まれていることがわかります。 WHERE status = 'Waiting'が含まれています(テキスト文字列の回りに一重引用符があることに注意してください)。あなたのバージョンによって、SQLはWaitingという名前のカラムの内容を探し、それを比較します。文字列 'Waiting'ではなく、比較します。

statusが待っている単語が含まれているレコードを検索するための正しいSQL:

SELECT Task_ID FROM Test_Task WHERE status = 'Waiting' 

が、何を生成していることである。

SQLのこの二作品が探している
SELECT Task_ID FROM Test_Task WHERE status = Waiting 

statusWaitingが同じ値を持つレコード。テーブルTest_TaskにはWaitingという名前の列が含まれていないため、SQLiteはSQLを解釈できず、表示されているエラーが発生します。

ではない数値はでなければならないことに注意してください(あなたのやり方でフォーマットすることによって)文字列に置くことができますが、パラメータで表され別々に実行に渡される必要があります。これは、1)値がユーザー入力によるSQLインジェクションが可能な場合、2)値自体に単一引用符が含まれている場合(たとえば、O'Malleyのように)は機能しません。

メソッドread_waitingのすべてのローカル変数を削除し、インスタンス値(self.table_nameなど)を直接参照することもできます。

+0

私の結果がWHERE status = 'Waiting'のようなフォーマットになることを望みません。私のスクリプトではステータスを渡して、両方の文字列を変数として待っています。 \ 形式(coi = column_2、tn = table_name、cn = column_3、cs = column_state)の場合は、 –

+0

が表示されます:c.execute( "SELECT({coi})FROM {tn} WHERE {cn} = {cs} ) conn.commit() –

+0

実行中に変数{cs}の値が変数{cn}に割り当てられているため、{cn} = = {cs}かどうかを確認するスクリプトが必要でしたが、残念ながらこれは起こっていません。あなたは私の問題について明確な考えを持っていることを願っています: –

関連する問題