1

我正在使用Books Qt 示例,但我使用的是 PostgreSQL 而不是 SQLite,因此我的主表和相关表是使用以下代码创建的:

QSqlQuery q;
if (!q.exec(QLatin1String("create table orders(id serial primary key, name varchar, supplier integer, product integer, year integer, rating integer)")))
    return q.lastError();
if (!q.exec(QLatin1String("create table suppliers(id serial primary key, name varchar, birthdate date)")))
    return q.lastError();
if (!q.exec(QLatin1String("create table products(id serial primary key, name varchar)")))
    return q.lastError();

现在,我想在数据库中添加一个新行。到目前为止,我有下一个代码:

QSqlRecord record;

QSqlField f0("id", QVariant::Int);
QSqlField f1("name", QVariant::String);
QSqlField f2("supplier", QVariant::Int);
QSqlField f3("product", QVariant::Int);
QSqlField f4("year", QVariant::Int);
QSqlField f5("rating", QVariant::Int);

// id is serial and I'd like not to set manually the value
f0.setValue(100);
f1.setValue(QVariant("Test1"));
f2.setValue(QVariant(3));
f3.setValue(QVariant(3));
f4.setValue(QVariant(2001));
f5.setValue(QVariant(5));

record.append(f0);
record.append(f1);
record.append(f2);
record.append(f3);
record.append(f4);
record.append(f5);

model->insertRecord(-1, record)

在这里我们遇到了问题。如您所见,id是主键,其类型是serial。如果我不设置值(即删除行record.append(f0);),表在 PostgreSQL 中正确更新,但 QtTableViewMainWindow.

我试过了QSqlField::setAutoValueQSqlField::setGenerated但行为是一样的。QAbstractItemModel::setData将是另一种选择,但这也不是解决方案。

我可以插入记录,然后将第一个字段更新为id存储在数据库中的字段,但我想知道这个问题是错误还是 API 是正确的,问题是我使用它的方式。

4

0 回答 0