Search code examples
sqlpyqtxor

PyQt exclusive OR in sql query


How can I make that if my first search shows results it doesn't do the second part of the query, but stops and displays results? I tried something like this, but it just gives me blank window and it's pretty chaotic:

def test_update(self):
          projectModel = QSqlQueryModel()
          projectModel.setQuery("""SELECT * FROM pacijent WHERE prezime = '%s' OR (prezime, 3) = metaphone('%s', 3) OR LEVENSHTEIN(LOWER(prezime), '%s') < 3 AND NOT (prezime = '%s' AND (prezime, 3) = metaphone('%s', 3) AND LEVENSHTEIN(LOWER(prezime), '%s') < 3)""" % (str(self.lineEdit.text()), str(self.lineEdit.text()), str(self.lineEdit.text()), str(self.lineEdit.text()), str(self.lineEdit.text()), str(self.lineEdit.text())))
          global projectView
          projectView = QtGui.QTableView()
          projectView.setModel(projectModel)
          projectView.show()

So, if it finds the exact value of attribute "prezime" it should display it, but if it doesn't it should call for more advance saerch tactics, such as metaphone and levenshtein.

EDIT:

I got it working like this:

ef search_data(self):
              myQSqlQueryModel = QSqlQueryModel()
              query = QSqlQueryModel()
              global myQTableView 
              myQTableView = QtGui.QTableView()
              querySuccess = False
              for queryCommand in [""" SELECT * FROM "%s" WHERE "%s" = '%s' """ % (str(self.search_from_table_lineEdit.text()), str(self.search_where_lineEdit.text()), str(self.search_has_value_lineEdit.text()))]:
                     myQSqlQueryModel.setQuery(queryCommand)
                     if myQSqlQueryModel.rowCount() > 0:
                            myQTableView.setModel(myQSqlQueryModel)
                            myQTableView.show()
                            querySuccess = True
                            break
              if not querySuccess:
                     query.setQuery(""" SELECT * FROM "%s" WHERE METAPHONE("%s", 3) = METAPHONE('%s', 3) OR LEVENSHTEIN("%s", '%s') < 4 """ % (str(self.search_from_table_lineEdit.text()), str(self.search_where_lineEdit.text()), str(self.search_has_value_lineEdit.text()), str(self.search_where_lineEdit.text()), str(self.search_has_value_lineEdit.text())))
                     global var
                     var = QtGui.QTableView()
                     var.setModel(query)
                     var.show()

Solution

  • After your query success, your can check your data in model if have any row count in this method. And your for loop to get many query;

    def testUpdate (self):
        myQSqlQueryModel = QtSql.QSqlQueryModel()
        myQTableView     = QtGui.QTableView()
        querySuccess = False
        for queryCommand in ["YOUR QUERY 1", "YOUR QUERY 2"]:
            myQSqlQueryModel.setQuery(queryCommand)
            if myQSqlQueryModel.rowCount() > 0:
                myQTableView.setModel(myQSqlQueryModel)
                myQTableView.show()
                querySuccess = True
                break
        if not querySuccess:
            QtGui.QMessageBox.critical(self, 'Query error', 'Not found')