QSqlError::lastError() when trying to insert. This post captures a small series of experiments to better understand the behavior. I started with a working example from the Qt Forum.">
—Trying out Composite Primary Keys with Qt's QSqlTableModel.
I found the interaction between Qt’s QSqlTableModel and composite primary keys difficult to understand.
Those difficulties involved recurrent “No Fields to update” messages from
QSqlError::lastError() when trying to insert.
This post captures a small series of experiments to better understand the behavior.
I started with a working example from the Qt Forum.
The code for this post is in a Git repository.
CREATE TABLE preferences( x TEXT NOT NULL, y TEXT NOT NULL, PRIMARY KEY(x, y) WITHOUT ROWID;
I’m using SQLite (3.28.0 2019-04-16 19:49:53 884b4b7e502b4e991677b53971277adfaf0a04a284f8e483e2553d0f83156b50) and qt 5.13.0.
Each change to bring the table in the example closer to my ideal is on a separate branch. This permits a simple diff between the master branch and the changed branch to determine the alterations I’ve made to the original example.
* fb8951a - Converted composite primary key types to text (introduce_text_fields) * 205492f - Introduced constraints on composite primary key (constrained_composite_primary_key) * c2f67c0 - Introduced an unconstrained composite primary key (composite_primary_key) * 184f5ed - Removed QCoreApplication (master) | * d731611 - Converted ROWID table to a table (without_row_id) | * 5dcc914 - Removed QCoreApplication |/ * ec024b1 - White space change * 3bd46af - Download of original source code * 2fe4f3e - Initial commit
The table structure is not the problem.
Turns out a critical component of the code was missing:
QSqlTableModel model(0, database()); model.setTable("rast123"); model.select(); model.database().transaction();
Initialization of the QSqlTableModel was being done in a constructor.
For some reason, this needs to be done again to prepare for the row insert.
Doing so with the methods attached to
this don’t have the desired effect.