如何在QxOrm中为多列添加联合唯一约束?
在QxOrm中实现多列联合唯一约束的方法
QxOrm本身没有提供直接设置联合唯一约束的内置API,但可以通过以下两种可靠方式实现需求:
方法一:手动执行自定义建表SQL
禁用QxOrm的自动建表逻辑,直接编写包含联合唯一约束的SQL语句创建表:
// 关闭QxOrm自动建表策略 qx::QxSqlDatabase::getSingleton()->setCreateTableStrategy(qx::create_table::none); // 执行自定义建表SQL,添加联合唯一约束 QSqlQuery query(qx::QxSqlDatabase::getSingleton()->getDatabase()); QString createTableSql = R"( CREATE TABLE IF NOT EXISTS clazz ( id BIGINT PRIMARY KEY NOT NULL, name VARCHAR(255) NOT NULL, packageName VARCHAR(255) NOT NULL, desc TEXT, UNIQUE(name, packageName) ); )"; query.exec(createTableSql);
方法二:利用QxOrm的自定义SQL扩展
在实体类的映射注册代码中,通过setCustomSqlCreateTableEnd方法注入联合唯一约束片段,让QxOrm自动建表时带上约束:
#include "clazz.h" #include <QxOrm/QxOrm.h> QX_REGISTER_CPP(clazz) namespace qx { template <> void register_class(QxClass<clazz> & t) { // 注册主键与字段 t.id(&clazz::id, "id"); t.data(&clazz::name, "name").setNotNull(true); t.data(&clazz::packageName, "packageName").setNotNull(true); t.data(&clazz::desc, "desc"); // 注入联合唯一约束到建表语句末尾 QString uniqueConstraint = "CONSTRAINT unique_name_package UNIQUE(name, packageName)"; t.setCustomSqlCreateTableEnd(uniqueConstraint); } } // namespace qx
注意:第二种方法依赖QxOrm版本,若使用较旧版本不支持setCustomSqlCreateTableEnd方法,优先选择第一种手动执行SQL的方案。
内容的提问来源于stack exchange,提问作者Shaobin Qian
相关产品推荐
相关产品推荐

