在sqlite 3中插入值但显示为列名

时间:2017-02-02 09:59:06

标签: python python-3.x sqlite

我在python 3.5中使用来自 SQLite3 的输入来将用户信息添加到数据库。但是,一旦我获取数据并插入数据库,而不是将数据插入列中,它告诉我没有列。 我得到的错误如下:

Tkinter回调中的异常 回溯(最近一次调用最后一次):

  

文件   " C:\ Users \ Luke_2 \ AppData \ Local \ Programs \ Python \ Python35-32 \ lib \ tkinter__init __。py",第1549行,调用       return self.func(* args)File" C:\ Users \ Luke_2 \ Desktop \ Computing \ Coursework \ live \ current.py",line   303,详细说明       cur_user.execute(" INSERT INTO LogIn(Email,Password)VALUES(" + user +"," + passw +")")sqlite3.OperationalError :没有这样的专栏:   一个

我的代码中的函数如下:

def details():
    user = email_sign.get()
    user1 = email1_sign.get()
    passw = password_sign.get()
    password1 = password1_sign.get()
    if user == user1 and passw == password1:
        cur_user.execute("INSERT INTO LogIn(Email,Password) VALUES("+user+","+passw+")")
        conn_user.commit()

    else:
        print("please try again")

1 个答案:

答案 0 :(得分:3)

这是因为您实际执行的请求在值周围没有引号,因此名称被解释为列名但SQL引擎。如果您分别通过ab,则会执行

INSERT INTO LogIn(Email,Password) VALUES(a,b)

什么时候需要

INSERT INTO LogIn(Email,Password) VALUES('a','b')

但你应该从不到那个!几十年来,在请求中构建请求但硬编码参数一直是SQL injection问题的原因。

正确的方法是建立一个参数化的请求:

cur_user.execute("INSERT INTO LogIn(Email,Password) VALUES(?,?)", (user, password))

更简单,更智能且不受SQL注入...