odb与MySQL sql-mode NO_AUTO_VALUE_ON_ZERO

时间:2017-03-22 13:45:36

标签: c++ mysql odb codesynthesis

我使用启用sql-mode NO_AUTO_VALUE_ON_ZERO的MySQl,这意味着在INS列的INSERT语句中不能使用0表示MySQL应该自动为PK赋值。

我有以下定义的持久对象:

#pragma db object
struct person
{
    #pragma db id auto
    uint64_t id_ = 0;

    std::string first_name_;
    std::string last_name_;
};

表:

CREATE TABLE `person` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`first_name` VARCHAR(50) NOT NULL,
`last_name` VARCHAR(50) NOT NULL,
 PRIMARY KEY(id)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 collate=utf8_unicode_ci;

我假设'id auto'特定器应该在mapper类中生成以下sql:

INSERT INTO person (first_name, last_name) VALUES ("John", "Dohn");

但真正的sql是:

INSERT INTO person (id, first_name, last_name) VALUES (0, "John", "Dohn");

导致插入PK值等于零的行并导致重复的PK错误,而不是插入带有自动增量id的行。

有没有办法强制odb compliter生成正确的SQL代码,因为我不想禁用NO_AUTO_VALUE_ON_ZERO?

1 个答案:

答案 0 :(得分:0)

我发现只有实现正确行为的可能方法是使用odb :: nullable:

#pragma db object
struct person
{
    #pragma db id auto
    odb::nullable<uint64_t> id_;

    std::string first_name_;
    std::string last_name_;
};

使用这种方法,如果id_ left未初始化,odb将生成以下查询:

INSERT INTO person (id, first_name, last_name) VALUES (NULL, "John", "Dohn");

这正是我所需要的。