在 SQLite 中使用 LIKE 语句搜索,使用 Python 和 Tkinter 库
python 310
原文标题 :Search with LIKE statement in SQLite, with Python and the Tkinter library
我正在开发一个项目,在添加搜索引擎时,它无法正常工作,我在其中写了一些东西,它抛出了以下 sqlite3 错误。
ProgrammingError:提供的链接数量不正确。当前语句使用 0 并提供 X。
我已经声明了搜索功能,并将其分配给搜索按钮,如果我更改查询中的某些内容,单击搜索按钮后它会变为空白而不会产生任何明显的结果,并且永远不会向我显示它在搜索框中指示的内容.老实说,我已经用尽了我所有的知识并陷入了这一步。如果您能正确地向我解释我未能前进的地方,我将不胜感激。我需要搜索来更新相同的树视图
我分享我的代码。
最好的祝福。
搜索功能下方的注释行是我尝试的其他选项
from tkinter import ttk
from tkinter import *
from tkinter import filedialog
import csv
import os
from tkinter import filedialog
from tkinter import messagebox
import sqlite3
class Stock:
# propiedades de la conexion a base de datos---
db_name = 'database.db'
def __init__(self, window):
# Inicializacion
self.Ventana_Principal = window
self.Ventana_Principal.title('Software Prueba')
# Contenedor de Entrada de datos
frame = LabelFrame(self.Ventana_Principal, text = 'Productos--')
frame.grid(row = 0, column = 0, columnspan = 30, padx = 30, pady = 30)
# Entrada de Clave
Label(frame, text = 'Clave: ').grid(row = 1, column = 0)
self.Clave = Entry(frame)
self.Clave.focus()
self.Clave.grid(row = 1, column = 1)
# Entrada de Unidad
Label(frame, text = 'Unidad: ').grid(row = 2, column = 0)
self.Unidad = Entry(frame)
self.Unidad.grid(row = 2, column = 1)
# Entrada de Nombre Producto
Label(frame, text = 'Nombre: ').grid(row = 3, column = 0)
self.Nombre = Entry(frame)
self.Nombre.grid(row = 3, column = 1)
# Entrada de Cantidad
Label(frame, text = 'Cantidad: ').grid(row = 1, column = 2)
self.Cantidad = Entry(frame)
self.Cantidad.grid(row = 1, column = 3)
# Entrada de Precio Compra
Label(frame, text = 'Precio Compra: ').grid(row = 2, column = 2)
self.PrecioCompra = Entry(frame)
self.PrecioCompra.grid(row = 2, column = 3)
# Entrada de Precio Venta
Label(frame, text = 'Precio Venta: ').grid(row = 3, column = 2)
self.PrecioVenta = Entry(frame)
self.PrecioVenta.grid(row = 3, column = 3)
# Boton Agregar Producto - Importar Archivo
ttk.Button(frame, text = 'Guardar Producto', command = self.agregar_productos).grid(row = 10, columnspan = 5, sticky = W + E)
#Seccion de Busqueda
Label(frame, text = 'Buscar: ').grid(row = 4, column = 0)
self.Buscador = Entry(frame, textvariable = StringVar())
self.Buscador.grid(row = 4, column = 1)
Button(frame, text = "Buscar Producto", command = self.buscar_registro).grid(row = 4, column = 2)
# Mensajes de Salida
self.mensaje = Label(text = '', fg = 'red')
self.mensaje.grid(row = 3, column = 5, columnspan = 5, sticky = W + E)
# Tabla
self.tabla = ttk.Treeview(height = 10, columns = ('#1','#2','#3','#4'))
self.tabla.grid(row = 4, column = 5, columnspan = 5)
self.tabla.heading('#0', text = 'Codigo/Clave', anchor = CENTER)
self.tabla.heading('#1', text = 'Producto', anchor = CENTER)
self.tabla.heading('#2', text = 'Cantidad', anchor = CENTER)
self.tabla.heading('#3', text = 'Precio Compra', anchor = CENTER)
self.tabla.heading('#4', text = 'Precio Venta', anchor = CENTER)
# Botones Eliminar - Editar - Importar
ttk.Button(text = 'Editar', command = self.editar_productos).grid(row = 5, column = 5, sticky = W + E)
ttk.Button(text = 'Eliminar', command = self.eliminar_productos).grid(row = 5, column = 9, sticky = W + E)
ttk.Button(text = 'Importar Archivo', command = self.importar_csv).grid(row = 1, column = 7, sticky = W + E)
ttk.Button(text = 'Exportar Archivo', command = self.exportar_csv).grid(row = 2, column = 7, sticky = W + E)
# Ordenando las filas
self.ordenar_productos()
# Funcion a ejecutar en la base de datos --Querys--
def run_query(self, query, parameters = ()):
with sqlite3.connect(self.db_name) as conn:
cursor = conn.cursor()
result = cursor.execute(query, parameters)
conn.commit()
return result
# Leer Tabla de base de datos
def ordenar_productos(self):
# Limpiar Tabla
records = self.tabla.get_children()
for element in records:
self.tabla.delete(element)
# Seleccionar datos
query = 'SELECT * FROM Productos ORDER BY Clave DESC'
db_rows = self.run_query(query)
# Acomodar datos
for row in db_rows:
self.tabla.insert('', 0, text = row[1], values = row[3:7])
def buscar_registro(self):
self.buscar = self.Buscador.get()
query = "SELECT Nombre FROM Productos WHERE Nombre LIKE '%"+self.buscar+"%' ORDER BY Nombre DESC" #"SELECT Nombre FROM Productos WHERE Nombre LIKE '%"+self.Buscador.get()+"%' ORDER BY Nombre DESC"
parameters = (self.buscar)
self.run_query(query, parameters)
self.ordenar_productos()
#palabra = self.Buscador.get()
#query = "SELECT Nombre FROM Productos WHERE Nombre LIKE '%"+self.buscar+"%' ORDER BY Nombre DESC"
#parameters = (self.buscar)
#self.run_query(query, parameters).fetchall()
#self.ordenar_productos()
# Validacion de datos ingresados por el usuario
def validacion(self):
return len(self.Clave.get()) != 0 and len(self.Nombre.get()) != 0 and len(self.Cantidad.get()) != 0 and len(self.PrecioCompra.get()) != 0 and len(self.PrecioVenta.get()) != 0
# Funcion Agregar Productos
def agregar_productos(self):
if self.validacion():
query = 'INSERT INTO Productos VALUES(NULL, ?, ?, ?, ?, ?, ?)'
parameters = (self.Clave.get(), self.Unidad.get(), self.Nombre.get(), self.Cantidad.get(), self.PrecioCompra.get(), self.PrecioVenta.get())
self.run_query(query, parameters)
self.mensaje['text'] = 'Producto {} Se Agrego Correctamente'.format(self.Nombre.get())
self.Clave.delete(0, END)
self.Unidad.delete(0, END)
self.Nombre.delete(0, END)
self.Cantidad.delete(0, END)
self.PrecioCompra.delete(0, END)
self.PrecioVenta.delete(0, END)
else:
self.mensaje['text'] = 'Los Campos no Pueden estar Vacios'
self.ordenar_productos()
# Funcion de Eliminar
def eliminar_productos(self):
self.mensaje['text'] = ''
try:
self.tabla.item(self.tabla.selection())['values'][0]
except IndexError as e:
self.mensaje['text'] = 'Debe Seleccionar un Registro'
return
self.mensaje['text'] = ''
nombre = self.tabla.item(self.tabla.selection())['text']
query = 'DELETE FROM Productos WHERE Clave = ?'
self.run_query(query, (nombre, ))
self.mensaje['text'] = 'Registro {} Eliminado'.format(nombre)
self.ordenar_productos()
# Funcion de Edicion
def editar_productos(self):
self.mensaje['text'] = ''
try:
self.tabla.item(self.tabla.selection())['values'][0]
except IndexError as e:
self.mensaje['text'] = 'Debe Seleccionar un Registro'
return
Nombre_Anterior = self.tabla.item(self.tabla.selection())['values'][0]
Cantidad_Anterior = self.tabla.item(self.tabla.selection())['values'][1]
Precio_Anterior_Compra = self.tabla.item(self.tabla.selection())['values'][2]
Precio_Anterior_Venta = self.tabla.item(self.tabla.selection())['values'][3]
self.Ventana_Edicion = Toplevel()
self.Ventana_Edicion.title ('Editar Producto')
# Nombre Anterior
Label(self.Ventana_Edicion, text = 'Nombre Anterior:').grid(row = 0, column = 1)
Entry(self.Ventana_Edicion, textvariable = StringVar(self.Ventana_Edicion, value = Nombre_Anterior), state = 'readonly').grid(row = 0, column = 2)
# Nuevo Nombre
Label(self.Ventana_Edicion, text = 'Nuevo Nombre:').grid(row = 1, column = 1)
Nuevo_Nombre = Entry(self.Ventana_Edicion)
Nuevo_Nombre.grid(row = 1, column = 2)
# Cantidad Anterior
Label(self.Ventana_Edicion, text = 'Stock Anterior:').grid(row = 2, column = 1)
Entry(self.Ventana_Edicion, textvariable = StringVar(self.Ventana_Edicion, value = Cantidad_Anterior), state = 'readonly').grid(row = 2, column = 2)
# Nueva Cantidad
Label(self.Ventana_Edicion, text = 'Nuevo Stock:').grid(row = 3, column = 1)
Nueva_Cantidad= Entry(self.Ventana_Edicion)
Nueva_Cantidad.grid(row = 3, column = 2)
# Precio Compra Anterior
Label(self.Ventana_Edicion, text = 'Precio Compra Anterior :').grid(row = 0, column = 3)
Entry(self.Ventana_Edicion, textvariable = StringVar(self.Ventana_Edicion, value = Precio_Anterior_Compra), state = 'readonly').grid(row = 0, column = 4)
# Nuevo Precio de Compra
Label(self.Ventana_Edicion, text = 'Nuevo Precio Compra:').grid(row = 1, column = 3)
Nuevo_Precio_Compra= Entry(self.Ventana_Edicion)
Nuevo_Precio_Compra.grid(row = 1, column = 4)
# Precio Venta Anterior
Label(self.Ventana_Edicion, text = 'Precio Venta Anterior:').grid(row = 2, column = 3)
Entry(self.Ventana_Edicion, textvariable = StringVar(self.Ventana_Edicion, value = Precio_Anterior_Venta), state = 'readonly').grid(row = 2, column = 4)
# Nuevo Precio de Venta
Label(self.Ventana_Edicion, text = 'Nuevo Precio Venta:').grid(row = 3, column = 3)
Nuevo_Precio_Venta= Entry(self.Ventana_Edicion)
Nuevo_Precio_Venta.grid(row = 3, column = 4)
# Boton Actualizar
Button(self.Ventana_Edicion, text = 'Actualizar', command = lambda: self.editar_registros(Nuevo_Nombre.get(), Nombre_Anterior, Nueva_Cantidad.get(), Cantidad_Anterior, Nuevo_Precio_Compra.get(), Precio_Anterior_Compra, Nuevo_Precio_Venta.get(), Precio_Anterior_Venta)).grid(row = 8, columnspan = 5, sticky = W + E)
self.Ventana_Edicion.mainloop()
# funcion de edicion
def editar_registros(self, Nuevo_Nombre, Nombre_Anterior, Nueva_Cantidad, Cantidad_Anterior, Nuevo_Precio_Compra, Precio_Anterior_Compra, Nuevo_Precio_Venta, Precio_Anterior_Venta):
query = 'UPDATE Productos SET Nombre = ?, Cantidad = ?, PrecioCompra = ?, PrecioVenta = ? WHERE Nombre = ? AND Cantidad = ? AND PrecioCompra = ? AND PrecioVenta = ?'
parameters = (Nuevo_Nombre, Nueva_Cantidad, Nuevo_Precio_Compra, Nuevo_Precio_Venta, Nombre_Anterior, Cantidad_Anterior, Precio_Anterior_Compra, Precio_Anterior_Venta)
self.run_query(query, parameters)
self.Ventana_Edicion.destroy()
self.mensaje['text'] = 'Registro {} fue Actualizado Correctamente'.format(Nuevo_Nombre)
self.ordenar_productos()
if __name__ == '__main__':
window = Tk()
application = Stock(window)
window.mainloop()
回复
我来回复-
Grismar 评论
你有
LIKE '%"+self.buscar+"%'
,但我希望你想要那些%%
在双引号内。另外,不要将查询构造为这样的字符串。相反,在查询中使用
?
并传递参数以允许 SQLite 安全地进行替换:query = "SELECT Nombre FROM Productos WHERE Nombre LIKE ? ORDER BY Nombre DESC" self.run_query(query, (f'%{self.buscar}%',))
如果您出于某种原因不喜欢 f-strings:
self.run_query(query, ('%' + self.buscar + '%',))
2年前