2016-10-20 4 views
-1

Я пытаюсь сделать SELECT value of column_2 from the sqlite3 TABLE table_name WHERE, column_3 value is 'Waiting'.скрипт python для чтения базы данных sqlite3 не работает

Я хочу передать имена столбцов, 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() 

Я получаю следующее сообщение об ошибке:

[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> SELECT Task_ID из Test_Task WHERE status = 'Waiting'; sqlite> Где я пытаюсь передать Task_ID, Test_Task, статус и Ожидание как переменные. –

+0

Здесь также должен быть приведен пример базы данных – Yugi

ответ

0

Если вы отформатируете свой SQL и распечатаете его, вы быстро увидите, что он содержит WHERE status = Waiting. Вы хотите, чтобы он содержал WHERE status = 'Waiting' (обратите внимание на одинарные кавычки вокруг текстовой строки). Ваша версия заставляет SQL искать содержимое столбца с именем Waiting и сравнивать его, а не строку «Ожидание».

Правильный SQL для поиска записей, где столбец status содержит слово Ожидание:

SELECT Task_ID FROM Test_Task WHERE status = 'Waiting' 

но то, что вы создаете это:

SELECT Task_ID FROM Test_Task WHERE status = Waiting 

Это вторая часть SQL ищет записи, где столбцы status и Waiting имеют одинаковые значения. Поскольку таблица Test_Task не содержит столбца с именем Waiting, SQLite не может интерпретировать SQL и создает ошибку, которую вы видите.

Обратите внимание, что значение, которое ваш источник должен не, должен быть помещен в строку путем форматирования (как это делается), но должен быть представлен параметром и передан отдельно в исполнение. Это связано с тем, что 1) если значение исходит из пользовательского ввода, то возможна инъекция SQL, и 2) она не будет работать, если само значение содержит одиночную кавычку (например, в имени O'Malley).

Вы также можете устранить все локальные переменные в методе read_waiting и напрямую ссылаться на значения экземпляра (self.table_name и т. Д.).

+0

Я не хочу, чтобы мой результат был в формате WHERE status = 'Waiting', В моем скрипте я пытаюсь передать статус и ожидание обеих строк как переменной. –

+0

, если вы видите: c.execute ("SELECT ({coi}) FROM {tn} WHERE {cn} = {cs}". \ format (coi = column_2, tn = table_name, cn = column_3, cs = column_state)) conn.commit() –

+0

значение переменной переменной {cs} присваивается переменной {cn} во время выполнения, я хотел, чтобы скрипт проверял, есть ли {cn} = = {cs}, но, к сожалению, этого не происходит.Надеюсь, у вас есть ясное представление о моей проблеме: –

Смежные вопросы