Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
读取sqlite3数据库的python脚本失败_Python_Python 2.7_Sqlite - Fatal编程技术网

读取sqlite3数据库的python脚本失败

读取sqlite3数据库的python脚本失败,python,python-2.7,sqlite,Python,Python 2.7,Sqlite,我试图从sqlite3表\u名称中选择列\u 2的值,其中,列\u 3的值为“等待” 我想将列名、表名和条件检查值作为变量传递 我在课堂上写过这样的脚本,但失败了 #!/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_sta

我试图
从sqlite3表\u名称中选择列\u 2的值,其中,列\u 3的值为“等待”

我想将列名、表名和条件检查值作为变量传递

我在课堂上写过这样的脚本,但失败了

#!/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()
我得到以下错误:

 dccom@dccom-vm:~/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));

请建议如何实现这一点。

如果格式化SQL并将其打印出来,您将很快看到它包含
其中status=Waiting
。您希望它包含
其中status='Waiting'
(注意文本字符串周围的单引号)。您的版本会导致SQL查找名为Waiting的列的内容,并将其与字符串“Waiting”进行比较

搜索列
status
中包含单词Waiting的记录的正确SQL是:

SELECT Task_ID FROM Test_Task WHERE status = 'Waiting'
但你产生的是:

SELECT Task_ID FROM Test_Task WHERE status = Waiting
第二条SQL正在搜索列
status
Waiting
具有相同值的记录。由于表
Test\u Task
不包含名为Waiting的列,SQLite无法解释SQL并产生您看到的错误

请注意,您提供的值不应通过格式化(如您所做的)放置在字符串中,而应通过参数表示,并单独传递到execute中。这是因为1)如果值来自用户输入SQL注入,则是可能的;2)如果值本身包含一个引号(例如,姓氏O'Malley),则无法工作


您还可以消除方法
read\u waiting
中的所有局部变量,并直接引用实例值(
self.table\u name
,等等)。

您到底想运行什么查询?我正在尝试使用python脚本执行以下命令:sqlite>从Test\u Task中选择Task\u ID,其中status='waiting';2 4 sqlite>我试图将任务ID、测试任务、状态和等待作为变量传递well@Yugi:我已更新数据库详细信息。我不希望结果的格式为status='Waiting',在我的脚本中,我试图传递状态并等待两个字符串作为变量。如果看到:c.execute(“SELECT({coi})FROM{tn},WHERE{cn}={cs}”。\format(coi=column_2,tn=table_name,cn=column_3,cs=column_state))conn.commit()变量{cs}中的值在执行时被分配给变量{cn},我想让脚本检查{cn}=={cs},但不幸的是,这没有发生。希望你对我的问题有清晰的认识:请回去重新阅读我的答案。您看到的错误(
没有这样的列:Waiting
)是因为您没有正确引用从格式化模板字符串生成的SQL中等待的字符串。我也尝试在sqlite数据库中添加引号,但仍然遇到同样的问题。请你写一行代码,我可以在这里用。这将非常有帮助。
SELECT Task_ID FROM Test_Task WHERE status = Waiting