使用 "dynamic" sql 查询过滤包含 sql 数据的 python 表



我有一个PyQt5对话框,其中有一个表、3个按钮(删除行、添加行和筛选器)和5个组合框,在这些组合框中,我将所有项目都写在外部SQL数据表中(例如,我有客户、驱动程序等等),用户可以从每个组合框中选择一个项目,选择后,当用户按下过滤器按钮(对象名称为"bottonefiltra")时,表将根据用户选择的客户、驱动程序ecc自动进行过滤。这是我的代码,这是我被卡住的地方:

def __init__(self):
super(modificaviaggi, self).__init__()
uic.loadUi('modifica_reg.ui', self)
bottonefiltra = self.bottone_filtra
bottonefiltra.clicked.connect(self.filtertable)
def filtertable(self):
self.tabella_registrazioni.clear()
self.tabella_registrazioni.blockSignals(True)
startdate = self.input_dal.date().toPyDate()
enddate = self.input_al.date().toPyDate()
farticle = self.filtro_articolo.currentText()
fwarehouse = self.filtro_magazzino.currentText()
fcustomer = self.filtro_cliente.currentText()
fplate = self.filtro_targa.currentText()
fdriver = self.filtro_autista.currentText()  

如何在不创建30 if语句的情况下创建根据所选项目进行更改的查询?我会更好地解释它,为了做我想做的事,我很可能会创建一个if来检查哪个组合框有这样选择的项目:

if farticle != " " :
if fwarehouse != " ":
if fcustomer != " " :
if fplate != " " :
if fdriver != " " :

然后我将执行一个查询,如下所示:

c.execute('SELECT * FROM Viaggi WHERE DataDDT < ? AND DataDDT > ? AND Ragione_sociale = ? AND Targa = ? AND Autista = ? AND Magazzino = ? AND Articolo = ?', 
(fcustomer, fplate, fdriver, fwarehouse, farticle))

但每次我都要根据选择的项目的组合写10-15个不同的查询(可能1个组合有一个项目被选择,第三个没有ecc…)。如果不写20个查询,也不做20个If语句来检查哪个组合有选择的项目,我该怎么做?

一种可能性是将每个组合与字段名配对,然后循环使用它们来构建查询和值列表。

__init__中的某个位置创建一个包含这些对的列表:

self.comboFields = (
(self.first_combo, 'FirstField'),
(self.second_combo, 'SecondField'),
...
)

然后对其进行迭代并构建查询:

query = 'SELECT * FROM Viaggi WHERE DataDDT < ? AND DataDDT > ?'
values = [startdate, enddate]
for combo, field in self.comboFields:
value = combo.currentText()
if value != ' ':
query += ' AND {} = ?'.format(field)
values.append(value)
c.execute(query, values)

相关内容

  • 没有找到相关文章

最新更新