[Interest] Best way to implement "delete from" when using a QSqlTableModel?

K. Frank kfrank29.c at gmail.com
Sun Jul 8 16:55:49 CEST 2012


Hello Guenther!

On Sun, Jul 8, 2012 at 8:11 AM, Guenther Boelter <gboelter at gmail.com> wrote:
> On 07/08/2012 12:45 AM, K. Frank wrote:
>
>> I have a QSqlTableModel (connected to a QTableView) that I use
>> to edit a table in a database.
>>
>> Specifically, I would like to achieve the effect of:
>>
>>    delete from my_table where my_column = 'some_value';
>>
>> I don't see a way to do this directly with QSqlTableModel.  Have I
>> missed anything?
>>
>> I see two possibilities:
>>
>> First, I could identify the rows I wish to delete (e.g., by running a
>> select query), and then call QSqlTableModel::removeRows on the
>> rows in question.
>>
>> Second, I could run "delete from" on the database, and then tell
>> QSqlTableModel to resynchronize itself with its underlying table.
>> ...
>
> Hi Frank,
>
> why not 'bool QSqlTableModel::removeRows ( int row, int count, const
> QModelIndex & parent = QModelIndex() )'?

Yes, that's one of the methods I am thinking about.  But I still have
to identify the rows to delete (and identify their location in the
QSqlTableModel).  I could run an independent select (separate from
the QSqlTableModel), but then I have to somehow find the selected
rows in the QSqlTableModel.  Or I could iterate through the rows
in the QSqlTableModel, identify by hand those that match my where
clause, and delete them.  But that seems like I would be reinventing
the "delete from .. where ..." wheel.

Another approach I'm thinking about (but haven't tried yet) is to set
a filter on the QSqlTableModel that corresponds to the where clause
of my sql delete statement:

   model->setFilter ("my_column = 'some_value'");

delete all the rows in the (filtered) QSqlTableModel, and then restore
the unfiltered QSqlTableModel by removing the filter (presumably by
setting an empty filter with a empty/null QString, setFilter (QString());).

>
> Regards
>
> Guenther

Thanks for your thoughts.


K. Frank



More information about the Interest mailing list