odb with MySQL sql-mode NO_AUTO_VALUE_ON_ZERO
odb with MySQL sql-mode NO_AUTO_VALUE_ON_ZERO
我使用 MySQl 并启用 sql-mode NO_AUTO_VALUE_ON_ZERO,这意味着不可能在 PK 列的 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_;
};
和table:
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' 规范器应该在映射器 类 中生成以下 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?
我发现实现正确行为的唯一可能方法是使用 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_ 未初始化,odb 将生成以下查询:
INSERT INTO person (id, first_name, last_name) VALUES (NULL, "John", "Dohn");
这正是我需要的。
我使用 MySQl 并启用 sql-mode NO_AUTO_VALUE_ON_ZERO,这意味着不可能在 PK 列的 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_;
};
和table:
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' 规范器应该在映射器 类 中生成以下 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?
我发现实现正确行为的唯一可能方法是使用 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_ 未初始化,odb 将生成以下查询:
INSERT INTO person (id, first_name, last_name) VALUES (NULL, "John", "Dohn");
这正是我需要的。