Python脚本中的SQLite Insert命令在Web上不起作用

时间:2013-12-10 01:18:13

标签: python mysql sqlite

我正在尝试在python脚本中使用SQLite插入操作,当我在命令行上手动执行它时它会起作用但是当我尝试在Web上访问它时它不会将它插入数据库中。这是我的功能:

def insertdb(unique_id,number_of_days):
        conn = sqlite3.connect('database.db')
        print "Opened database successfully";
        conn.execute("INSERT INTO IDENT (ID_NUM,DAYS_LEFT) VALUES (?,?)",(unique_id,number_of_days));
        conn.commit()
        print "Records created successfully";
        conn.close()

当它在Web上执行时,它只显示输出“Opened database successfully”但似乎没有将值插入数据库。我错过了什么?这是服务器配置问题吗?我已经检查了写入时的数据库权限,并且它们已正确设置。

1 个答案:

答案 0 :(得分:2)

问题几乎可以肯定是,您尝试在当前工作目录中创建或打开名为database.db的数据库,并且以下情况之一为真:

  • 数据库存在且您无权写入数据库。因此,一切都有效,直到您尝试执行需要写访问权限的操作(例如commit INSERT}。
  • 数据库存在,您有权写入数据库,但您无权在目录中创建新文件。所以,一切都有效,直到sqlite需要创建一个临时文件(它几乎总是用于execute - INSERT)。

同时,你没有提到什么是web服务器/容器等。你正在使用,但显然你已经将它配置为静默地吞下所有错误,这对于任何调试来说都是非常非常糟糕的主意。将其配置为以某种方式报告错误。否则,你永远不会弄清楚出了什么问题。

如果您无法控制服务器配置,则至少可以将所有代码包装在try / except中,并手动将异常记录到您具有写访问权限的文件中(理想情况下)通过logging模块,或只有openwrite,如果最糟糕的情况发生。)

或者,你可以用愚蠢的print语句做到这一点,就像你已经在做的那样:

def insertdb(unique_id,number_of_days):
        conn = sqlite3.connect('database.db')
        print "Opened database successfully";
        try:
            conn.execute("INSERT INTO IDENT (ID_NUM,DAYS_LEFT) VALUES (?,?)",(unique_id,number_of_days));
            conn.commit()
            print "Records created successfully";
        except Exception as e:
            print e # or, better, traceback.print_exc()
        conn.close()