在PostgreSQL中插入一个serial类型的QSqlRecord

时间:2016-11-15 12:08:26

标签: c++ postgresql qt qt5 qsqldatabase

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

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中正确更新,但Qt在TableView中显示MainWindow中的空白行。

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

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

0 个答案:

没有答案