SQL上的SQLite3出错

时间:2017-09-04 05:24:23

标签: python sqlite

这是我的代码。当我尝试运行此代码时。我面临以下错误。任何人都可以建议我如何纠正该错误,这个脚本可以成功运行。

from tkinter import *
import sqlite3

global a, b

def sair_mestre ():
    global mestre
    mestre.quit()

def criar_tabela():
    c.execute("CREATE TABLE IF NOT EXISTS Registro (Nome text, Senha text)")

def receberl():
    global Nome, Senha
    Nome = entradalogin.get()
    Senha = entradasenha.get()
    ler_dados(Senha)
    if x:
        sucesso = Label(mestre, text="Login Realizado com sucesso!")
        sucesso.grid(row=1,column=1)
    else:
        inexistente = Label(mestre, text="Login errado")
        inexistente.grid(row=1, column=1)

def receber2():
    logincadastro2 = entradalogin2.get()
    senhacadastro2 = entradasenha2.get()
    c.execute("INSERT INTO Registro VALUES(?, ?)", (logincadastro2, senhacadastro2))  # Utilização de Variáveis
    conexao.commit()
    cadastro.destroy()

    realizado = Label(mestre, text="Cadastrado com sucesso")
    realizado.grid(row=1, column=1)

    botaorealizado = Button(mestre, text="Ok", command=sair_mestre)
    botaorealizado.grid(row=2, column=1)

def registro():
    programa.destroy()

    global cadastro
    cadastro = Frame(mestre)
    cadastro.grid()

    realizando_cadastro = Label(cadastro, text="Realizando Cadastro...")
    realizando_cadastro.grid(row=0, column=1)

    labellogin = Label(cadastro, text="Login")
    labellogin.grid(row=1, column=0)

    labelsenha = Label(cadastro, text="Senha")
    labelsenha.grid(row=2, column=0)

    global entradalogin2
    entradalogin2 = Entry(cadastro)
    entradalogin2.grid(row=1, column=1)

    global entradasenha2
    entradasenha2 = Entry(cadastro, show="•")
    entradasenha2.grid(row=2, column=1)

    botaocadastro = Button(cadastro, text="Ok", command=receber2)
    botaocadastro.grid(row=3, column=1)

def ler_dados (valorbusca):
    global row
    global x
    buscar_dados = "SELECT * FROM Registro WHERE Nome = ? AND Senha = ?"
    for row in c.execute(buscar_dados, (valorbusca,)):
        if Nome and Senha in row:
            x = True


conexao = sqlite3.connect("Registro_Cadastro.db")
c = conexao.cursor()

criar_tabela()

mestre = Tk()

programa = Frame(mestre)
programa.grid()

login = Label(programa, text="Login")
login.grid(row=0, column=0)

global entradalogin
entradalogin = Entry(programa)
entradalogin.grid(row=0, column=1)

senha = Label(programa, text="Senha")
senha.grid(row=1, column=0)

global entradasenha
entradasenha = Entry(programa, show="•")
entradasenha.grid(row=1, column=1)

botaook = Button(programa, text="Entrar",command= receberl)
botaook.grid(row=2, column=1)

botaoregistro = Button(programa, text="Cadastro",command= registro)
botaoregistro.grid(row=3,column=1)

mestre.mainloop()

这是我的程序抛出的错误。任何人都可以帮我解决这个错误吗? 我认为错误发生在receberl函数中。

File "-------", line 1558, in __call__
    return self.func(*args)

File "------", line 17, in receberl
    ler_dados(Senha)

File "------", line 69, in ler_dados
    for row in c.execute(buscar_dados, (valorbusca,)):
sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 2, and there are 1 supplied.

2 个答案:

答案 0 :(得分:3)

您收到的错误消息非常清楚:您的SELECT查询绑定了两个参数,但您的代码仅指定其中一个参数。要解决此问题,请先将呼叫更改为ler_dados()以传入用户名和密码:

def receberl():
    global Nome, Senha
    Nome = entradalogin.get()
    Senha = entradasenha.get()
    ler_dados(Nome, Senha)
    # ... etc.

然后在您的查询中绑定用户名和密码:

def ler_dados(username, valorbusca):
    global row
    global x
    buscar_dados = "SELECT * FROM Registro WHERE Nome = ? AND Senha = ?"
    for row in c.execute(buscar_dados, (username, valorbusca,)):
        if Nome and Senha in row:
            x = True

答案 1 :(得分:2)

您需要为此查询提供2个参数:

buscar_dados = "SELECT * FROM Registro WHERE Nome = ? AND Senha = ?"

当你在ler_dados(Senha)函数中调用receberl时,似乎缺少Nome

你应该首先使用:ler_dados(Nome, Senha)

然后将方法ler_dados更改为:

def ler_dados (nome, senha):
    global row
    global x
    buscar_dados = "SELECT * FROM Registro WHERE Nome = ? AND Senha = ?"
    for row in c.execute(buscar_dados, (nome, senha)):
        if Nome and Senha in row:
            x = True