Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. Qt for Python
  4. Update record in tableView by QSqlQuery
Qt 6.12 LTS is out! See what's new in the release blog

Update record in tableView by QSqlQuery

Scheduled Pinned Locked Moved Unsolved Qt for Python
19 Posts 3 Posters 3.3k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • Karoluss96K Offline
    Karoluss96K Offline
    Karoluss96
    wrote on last edited by
    #10

    Well, Update is difficult as it change values after select another record.
    So that in my point of view (check If I'm thinking good!) binding values is compulsory, wheras QSqlRecord and QueryModel make values to be stable!?

    1 Reply Last reply
    0
    • Karoluss96K Offline
      Karoluss96K Offline
      Karoluss96
      wrote on last edited by
      #11

      OK, I find a way:
      QSqlTableModel::updateRowInTable(int row, const QSqlRecord &values) -> row I have, QSqlRecord::value(int index) but about the 2nd I'm not sure is good enough

      1 Reply Last reply
      0
      • Karoluss96K Offline
        Karoluss96K Offline
        Karoluss96
        wrote on last edited by
        #12

        Now it looks that:

        tm =QSqlTableModel()
                rec= QSqlRecord()
                mod = QSqlQueryModel()
                for col in range(model.columnCount()):
                    rowData = [model.index(row, col).data() for col in range(model.columnCount()) ]
                    print (rowData[0])
                    literyBind = [':a',':bb',':bc'...':cca',':ccb',':id']
                    if rowData[col] is None:
                        query.bindValue(literyBind[col],'')
                        rec.setNull('')
                        rec=rec.value('')
                    else:
                        query.bindValue(literyBind[col],rowData[col])
                print(query.executedQuery())
                if query.exec_():#query.next():
                    if rec is None or tm is None:
                        rec= ''
                        tm = ''
                    for i in rowData:
                        Uprow=tm.updateRowInTable(row,rowData[i])
                        print (Uprow)
        

        in rowData[i] shout: list indices must be integers or slices, not str, but this table (a list!) cannot be converted into int, as there's only one integer value in this table

        jsulmJ JonBJ 2 Replies Last reply
        0
        • Karoluss96K Karoluss96

          Now it looks that:

          tm =QSqlTableModel()
                  rec= QSqlRecord()
                  mod = QSqlQueryModel()
                  for col in range(model.columnCount()):
                      rowData = [model.index(row, col).data() for col in range(model.columnCount()) ]
                      print (rowData[0])
                      literyBind = [':a',':bb',':bc'...':cca',':ccb',':id']
                      if rowData[col] is None:
                          query.bindValue(literyBind[col],'')
                          rec.setNull('')
                          rec=rec.value('')
                      else:
                          query.bindValue(literyBind[col],rowData[col])
                  print(query.executedQuery())
                  if query.exec_():#query.next():
                      if rec is None or tm is None:
                          rec= ''
                          tm = ''
                      for i in rowData:
                          Uprow=tm.updateRowInTable(row,rowData[i])
                          print (Uprow)
          

          in rowData[i] shout: list indices must be integers or slices, not str, but this table (a list!) cannot be converted into int, as there's only one integer value in this table

          jsulmJ Offline
          jsulmJ Offline
          jsulm
          Lifetime Qt Champion
          wrote on last edited by
          #13

          @Karoluss96 said in Update record in tableView by QSqlQuery:

          list indices must be integers or slices, not str, but this table (a list!) cannot be converted into int,

          What about

          for i in range(len(rowData)):
          

          ?
          Is a simple Python thing...

          https://forum.qt.io/topic/113070/qt-code-of-conduct

          1 Reply Last reply
          0
          • Karoluss96K Offline
            Karoluss96K Offline
            Karoluss96
            wrote on last edited by
            #14

            @jsulm said in Update record in tableView by QSqlQuery:

            range(len(rowData))

            this function looks better but still have an error:
            updateRowInTable(self, int, QSqlRecord): argument 2 has unexpected type 'str'

            Meanwhile I'd found the setValue function in QSqlRecord, so now it looks that:

             if rowData[col] is None:
                            query.bindValue(literyBind[col],'')
                            rec.setNull('')
                            rec=rec.value('')
                        else:
                            query.bindValue(literyBind[col],rowData[col])
                    print(query.executedQuery())
                    if query.exec_():#query.next():
                        if rec is None or tm is None or rowData[col] is None:
                            rec= ''
                            tm = ''
                            sv= rec.setValue(literyBind[col],'') 
                        else:
                          for i in range(len(rowData)):
                            Uprow=tm.updateRowInTable(row,rowData[i])
                            #sv.rec.setValue(literyBind[col],rowData[i])
                            print (Uprow)
                    else:
                        print (query.lastError().text())
            
            1 Reply Last reply
            0
            • Karoluss96K Karoluss96

              Now it looks that:

              tm =QSqlTableModel()
                      rec= QSqlRecord()
                      mod = QSqlQueryModel()
                      for col in range(model.columnCount()):
                          rowData = [model.index(row, col).data() for col in range(model.columnCount()) ]
                          print (rowData[0])
                          literyBind = [':a',':bb',':bc'...':cca',':ccb',':id']
                          if rowData[col] is None:
                              query.bindValue(literyBind[col],'')
                              rec.setNull('')
                              rec=rec.value('')
                          else:
                              query.bindValue(literyBind[col],rowData[col])
                      print(query.executedQuery())
                      if query.exec_():#query.next():
                          if rec is None or tm is None:
                              rec= ''
                              tm = ''
                          for i in rowData:
                              Uprow=tm.updateRowInTable(row,rowData[i])
                              print (Uprow)
              

              in rowData[i] shout: list indices must be integers or slices, not str, but this table (a list!) cannot be converted into int, as there's only one integer value in this table

              JonBJ Online
              JonBJ Online
              JonB
              wrote on last edited by JonB
              #15

              @Karoluss96
              I have no idea what your question is. I do not understand your code or your approach. You have a rec= QSqlRecord(). What is rec.setNull('') supposed to do for you? What about rec=rec.value('') which changes what rec is? What does print(query.executedQuery()) tell you if you have not executed query yet? Where you go rec= '' you follow that with sv= rec.setValue(), how is that supposed to work? Why are you using QTableModel::updateRowInTable() when the docs usually advise you would not call this? Why are you calling it with rowData[i] (for QSqlRecord values) which seems to be one column in a row?

              You should be stepping through your code in a debugger to discover for yourself how it is behaving, not just throwing code at us and asking what is wrong.

              I will leave others to respond now, my polite advice is that you need to understand what you are doing and what you need to do before trying all this code you have.

              1 Reply Last reply
              0
              • Karoluss96K Offline
                Karoluss96K Offline
                Karoluss96
                wrote on last edited by
                #16

                Ah wait I forgot show you this:

                 tm =QSqlTableModel()
                 rec= QSqlRecord()
                mod = QSqlQueryModel()
                

                And after that I cleaned the code to:

                 if rec is None or tm is None or rowData[col] is None:#Na wypadek jakby się pojawił
                                rec= ''
                                tm = ''    
                                #query.bindValue(literyBind[col],'')
                                sv= rec.setValue(literyBind[col],'')
                            # else:
                            #   pass  
                                #query.bindValue(literyBind[col],rowData[col])
                        print(query.executedQuery())
                        if query.exec_():#query.next():
                              for i in range(len(rowData)):
                                sv=rec.setValue(literyBind[col],rowData[i])
                                Uprow=tm.updateRowInTable(row,sv)
                                print (Uprow)
                

                Yes, I also need a break and do sth diffrent in code

                JonBJ 1 Reply Last reply
                0
                • Karoluss96K Karoluss96

                  Ah wait I forgot show you this:

                   tm =QSqlTableModel()
                   rec= QSqlRecord()
                  mod = QSqlQueryModel()
                  

                  And after that I cleaned the code to:

                   if rec is None or tm is None or rowData[col] is None:#Na wypadek jakby się pojawił
                                  rec= ''
                                  tm = ''    
                                  #query.bindValue(literyBind[col],'')
                                  sv= rec.setValue(literyBind[col],'')
                              # else:
                              #   pass  
                                  #query.bindValue(literyBind[col],rowData[col])
                          print(query.executedQuery())
                          if query.exec_():#query.next():
                                for i in range(len(rowData)):
                                  sv=rec.setValue(literyBind[col],rowData[i])
                                  Uprow=tm.updateRowInTable(row,sv)
                                  print (Uprow)
                  

                  Yes, I also need a break and do sth diffrent in code

                  JonBJ Online
                  JonBJ Online
                  JonB
                  wrote on last edited by JonB
                  #17

                  @Karoluss96 said in Update record in tableView by QSqlQuery:

                              rec= ''
                              tm = ''    
                              #query.bindValue(literyBind[col],'')
                              sv= rec.setValue(literyBind[col],'')
                  

                  If you just look at this how can it make any sense to set rec to an empty string and then call sv= rec.setValue()??

                              sv=rec.setValue(literyBind[col],rowData[i])
                              Uprow=tm.updateRowInTable(row,sv)
                  

                  What does rec.setValue() return? Nothing or a boolean? Is that really what you want to try putting into your row?

                  1 Reply Last reply
                  1
                  • Karoluss96K Offline
                    Karoluss96K Offline
                    Karoluss96
                    wrote on last edited by Karoluss96
                    #18

                    The print in query.executedQuery():

                    UPDATE ZARZADZANIE.ZAMOWIENIA SET ZAMAWIAJACY_KOD=:a,OBSZAR_KOD=:bb,....TERYT=:ccb WHERE ID=:id
                    

                    So maybe problem lays on query level

                    JonBJ 1 Reply Last reply
                    0
                    • Karoluss96K Karoluss96

                      The print in query.executedQuery():

                      UPDATE ZARZADZANIE.ZAMOWIENIA SET ZAMAWIAJACY_KOD=:a,OBSZAR_KOD=:bb,....TERYT=:ccb WHERE ID=:id
                      

                      So maybe problem lays on query level

                      JonBJ Online
                      JonBJ Online
                      JonB
                      wrote on last edited by JonB
                      #19

                      @Karoluss96
                      And? Did you look at its documentation?

                      Returns the last query that was successfully executed.

                      You place it immediately before query.exec_(). Why?

                      So maybe problem lays on query level

                      Sorry, but your whole code needs rewriting, more importantly you need to take time to understand what you are doing. Same with some of your Python. Sorry, but true. Best of luck.

                      1 Reply Last reply
                      1

                      • Login

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • Users
                      • Groups
                      • Search
                      • Get Qt
                      • Unsolved