NexusForce 1.0.0
A rigorously engineered full-stack C++ backend library.
载入中...
搜索中...
未找到
sql_builder.hpp
浏览该文件的文档.
1#ifndef NEFORCE_DATABASE_SQL_BUILDER_HPP__
2#define NEFORCE_DATABASE_SQL_BUILDER_HPP__
3
10
14NEFORCE_BEGIN_NAMESPACE__
15
84
85#ifdef DELETE
86# undef DELETE
87#endif
88
89#ifdef EXCEPT
90# undef EXCEPT
91#endif
92
93#ifdef INTERSECT
94# undef INTERSECT
95#endif
96
115
126
131enum class sql_order : uint8_t {
134};
135
150
163
164
176class NEFORCE_API sql_builder {
177public:
195
205
213
219 string name;
220 string type;
221 bool not_null = false;
222 bool unique_ = false;
223 bool primary_key = false;
224 bool auto_increment = false;
226 string check_expr;
227 };
228
239
245 string view_name;
246 string view_query;
247 bool or_replace = false;
248 };
249
257
268
275 string query;
276 };
277
282 struct cte_entry {
283 string name;
284 string query;
285 bool recursive = false;
286 };
287
288private:
289 sql_operate sql_type_ = sql_operate::SELECT;
291 size_t param_seq_ = 0;
292 string table_;
293 string table_alias_;
294 vector<string> where_conditions_;
295 vector<set_op_entry> set_operations_;
296 vector<cte_entry> cte_entries_;
297 bool drop_if_exists_ = false;
298
299 unique_ptr<select_data> select_data_;
300 unique_ptr<insert_data> insert_data_;
301 unique_ptr<update_data> update_data_;
302 unique_ptr<create_table_data> create_table_data_;
303 unique_ptr<create_view_data> create_view_data_;
304 unique_ptr<alter_table_data> alter_table_data_;
305 unique_ptr<create_index_data> create_index_data_;
306
307private:
308 select_data* ensure_select_data();
309 insert_data* ensure_insert_data();
310 update_data* ensure_update_data();
311 create_table_data* ensure_create_table_data();
312 create_view_data* ensure_create_view_data();
313 alter_table_data* ensure_alter_table_data();
314 create_index_data* ensure_create_index_data();
315
316 void clear_data() noexcept;
317
318 NEFORCE_NODISCARD string make_placeholder(size_t index) const;
319
320public:
324 sql_builder() = default;
325
329 ~sql_builder() = default;
330
336
342 sql_builder& operator=(const sql_builder& other);
343
348 sql_builder(sql_builder&& other) noexcept = default;
349
355 sql_builder& operator=(sql_builder&& other) noexcept = default;
356
362 sql_builder& select(vector<string> fields);
363
369 sql_builder& select(std::initializer_list<string> fields);
370
376 sql_builder& select(string field);
377
383
389
395 sql_builder& from(string table) noexcept;
396
403 sql_builder& from(string table, string alias) noexcept;
404
412 sql_builder& join(sql_join type, string table, string on_condition);
413
420 sql_builder& join(string table, string on_condition);
421
428 sql_builder& left_join(string table, string on_condition);
429
436 sql_builder& right_join(string table, string on_condition);
437
444 sql_builder& inner_join(string table, string on_condition);
445
452 sql_builder& full_join(string table, string on_condition);
453
459 sql_builder& where(string condition);
460
467 sql_builder& where_eq(string field, string value);
468
475 sql_builder& where_ne(string field, string value);
476
483 sql_builder& where_gt(string field, string value);
484
491 sql_builder& where_ge(string field, string value);
492
499 sql_builder& where_lt(string field, string value);
500
507 sql_builder& where_le(string field, string value);
508
515 sql_builder& where_like(string field, string pattern);
516
523 sql_builder& where_not_like(string field, string pattern);
524
531 sql_builder& where_in(string field, vector<string> values);
532
539 sql_builder& where_not_in(string field, vector<string> values);
540
548 sql_builder& where_between(string field, string start, string end);
549
557 sql_builder& where_not_between(string field, string start, string end);
558
565
572
578 sql_builder& where_exists(string subquery);
579
585 sql_builder& where_not_exists(string subquery);
586
594 sql_builder& or_where(string condition);
595
601 sql_builder& group_by(string field);
602
608 sql_builder& group_by(const vector<string>& fields);
609
619
629
635 sql_builder& having(string condition);
636
643 sql_builder& order_by(string field, sql_order order = sql_order::ASC);
644
650 sql_builder& order_by_asc(string field);
651
658
665
672
682 sql_builder& fetch_first(int row_count);
683
690 sql_builder& page(int page_num, int page_size);
691
698 sql_builder& insert_into(string table, vector<string> fields);
699
706
713
719 sql_builder& values(std::initializer_list<string> values);
720
726 sql_builder& values(vector<vector<string>> value_rows);
727
734
740 sql_builder& columns(vector<string> fields);
741
748
754 sql_builder& set(string assignment);
755
762 sql_builder& set(string field, string value);
763
770 sql_builder& set_increment(string field, int value = 1);
771
778 sql_builder& set_decrement(string field, int value = 1);
779
785
792
799
806
812 sql_builder& union_(string query);
813
819 sql_builder& union_all(string query);
820
826 sql_builder& intersect(string query);
827
834
840 sql_builder& except_(string query);
841
847 sql_builder& except_all(string query);
848
855 sql_builder& with_(string name, string query);
856
863 sql_builder& with_recursive(string name, string query);
864
871
879 sql_builder& select_row_number(string alias, const vector<string>& partition_by = {},
880 const vector<string>& order_by = {});
881
889 sql_builder& select_rank(string alias, const vector<string>& partition_by = {},
890 const vector<string>& order_by = {});
891
899 sql_builder& select_dense_rank(string alias, const vector<string>& partition_by = {},
900 const vector<string>& order_by = {});
901
910 sql_builder& select_ntile(int buckets, string alias, const vector<string>& partition_by = {},
911 const vector<string>& order_by = {});
912
921 sql_builder& select_lead(string field, string alias, const vector<string>& partition_by = {},
922 const vector<string>& order_by = {});
923
932 sql_builder& select_lag(string field, string alias, const vector<string>& partition_by = {},
933 const vector<string>& order_by = {});
934
943 sql_builder& select_first_value(string field, string alias, const vector<string>& partition_by = {},
944 const vector<string>& order_by = {});
945
954 sql_builder& select_last_value(string field, string alias, const vector<string>& partition_by = {},
955 const vector<string>& order_by = {});
956
964 static string make_case_simple(string field, vector<pair<string, string>> when_then, string else_val = "");
965
972 static string make_case_searched(vector<pair<string, string>> when_then, string else_val = "");
973
980 static string make_cast(string expression, string target_type);
981
988
995
1002
1009
1016 sql_builder& column(string name, string type);
1017
1024 sql_builder& column_not_null(string name, string type);
1025
1032 sql_builder& column_primary_key(string name, string type);
1033
1040 sql_builder& column_unique(string name, string type);
1041
1049 sql_builder& column_default(string name, string type, string default_val);
1050
1058 sql_builder& column_check(string name, string type, string check_expr);
1059
1067
1074
1082 sql_builder& table_foreign_key(string column, string ref_table, string ref_column);
1083
1090
1097
1104
1111 sql_builder& add_column(string name, string type);
1112
1119
1126 sql_builder& alter_column_set_type(string name, string new_type);
1127
1134 sql_builder& alter_column_set_default(string name, string default_val);
1135
1142
1149
1156
1163 sql_builder& rename_column(string old_name, string new_name);
1164
1171
1177 sql_builder& drop_constraint(string constraint_name);
1178
1185 sql_builder& create_view(string view_name, string select_query);
1186
1193 sql_builder& create_or_replace_view(string view_name, string select_query);
1194
1200 sql_builder& drop_view(string view_name);
1201
1208
1217
1226
1232 sql_builder& drop_index(string index_name);
1233
1240
1247
1254 sql_builder& select_count(string field, string alias);
1255
1262
1268
1275 sql_builder& select_sum(string field, string alias);
1276
1282 sql_builder& select_sum(string field);
1283
1290 sql_builder& select_avg(string field, string alias);
1291
1297 sql_builder& select_avg(string field);
1298
1305 sql_builder& select_max(string field, string alias);
1306
1312 sql_builder& select_max(string field);
1313
1320 sql_builder& select_min(string field, string alias);
1321
1327 sql_builder& select_min(string field);
1328
1335
1342 sql_builder& select_subquery(string subquery, string alias);
1343
1349 sql_builder& select_subquery(string subquery);
1350
1357 sql_builder& from_subquery(string subquery, string alias);
1358
1363 sql_builder& reset() noexcept;
1364
1369 NEFORCE_NODISCARD sql_operate type() const noexcept { return sql_type_; }
1370
1375 NEFORCE_NODISCARD string_view table() const noexcept { return table_.view(); }
1376
1381 NEFORCE_NODISCARD bool is_empty() const noexcept { return table_.empty(); }
1382
1391 dialect_ = dialect;
1392 return *this;
1393 }
1394
1399 NEFORCE_NODISCARD sql_dialect dialect() const noexcept { return dialect_; }
1400
1409 NEFORCE_NODISCARD size_t param_count() const noexcept { return param_seq_; }
1410
1417 NEFORCE_NODISCARD string placeholder(const size_t index) const { return make_placeholder(index); }
1418
1427 NEFORCE_NODISCARD string next_placeholder() { return make_placeholder(++param_seq_); }
1428
1436 sql_builder& set_param(string field) { return set(move(field), next_placeholder()); }
1437
1445 NEFORCE_NODISCARD string build() const;
1446};
1447 // SQL
1449
1450NEFORCE_END_NAMESPACE__
1451#endif // NEFORCE_DATABASE_SQL_BUILDER_HPP__
constexpr basic_string_view view(const size_type off, const size_type count=npos) const
获取子视图
sql_builder & distinct()
添加DISTINCT关键字
sql_builder & where_eq(string field, string value)
添加相等条件
sql_builder & select_first_value(string field, string alias, const vector< string > &partition_by={}, const vector< string > &order_by={})
添加FIRST_VALUE窗口函数
sql_builder & from(string table) noexcept
设置主表
sql_builder & add_column(string name, string type)
添加列(ALTER TABLE ADD COLUMN)
sql_builder & column_default(string name, string type, string default_val)
添加带DEFAULT值的列定义
sql_builder & right_join(string table, string on_condition)
添加RIGHT JOIN子句
bool is_empty() const noexcept
检查构建器是否为空
sql_builder & where_lt(string field, string value)
添加小于条件
sql_builder & intersect_all(string query)
添加INTERSECT ALL集合操作
sql_builder & alter_table(string table)
修改表
sql_builder & column_not_null(string name, string type)
添加带NOT NULL约束的列定义
sql_builder & select_sum(string field)
添加SUM聚合函数(无别名)
static string make_cast(string expression, string target_type)
构建CAST类型转换表达式
sql_builder & create_unique_index(string index_name, string table, vector< string > columns)
创建唯一索引(CREATE UNIQUE INDEX)
sql_builder & select_lead(string field, string alias, const vector< string > &partition_by={}, const vector< string > &order_by={})
添加LEAD窗口函数
sql_builder & where_le(string field, string value)
添加小于等于条件
sql_builder & table_foreign_key(string column, string ref_table, string ref_column)
添加表级FOREIGN KEY约束
sql_builder & order_by_asc(string field)
添加升序排序
sql_builder & set_param(string field)
添加 SET 赋值
sql_builder & table_check(string expr)
添加表级CHECK约束
sql_builder & where_gt(string field, string value)
添加大于条件
sql_builder & union_(string query)
添加UNION集合操作
sql_builder & reset() noexcept
重置构建器状态
string_view table() const noexcept
获取当前表名
sql_builder & column_auto_increment(string name, string type)
添加自增主键列定义(事实标准:AUTO_INCREMENT)
sql_builder & with_(string name, string query)
添加CTE(WITH子句)
sql_builder & create_or_replace_view(string view_name, string select_query)
创建视图(OR REPLACE)
sql_builder & select_max(string field)
添加MAX聚合函数(无别名)
sql_builder & order_by_desc(string field)
添加降序排序
sql_builder & create_view(string view_name, string select_query)
创建视图
sql_builder & select_max(string field, string alias)
添加MAX聚合函数(带别名)
sql_builder & where_ge(string field, string value)
添加大于等于条件
sql_builder & group_by_rollup(vector< string > fields)
添加GROUP BY ROLLUP子句
sql_builder & column(string name, string type)
添加基础列定义
sql_builder & select_count(string field, string alias)
添加COUNT聚合函数(带别名)
sql_builder & columns(vector< string > fields)
设置INSERT字段列表
sql_builder()=default
默认构造函数
sql_builder & truncate(string table)
截断表(TRUNCATE TABLE)
sql_builder & add_primary_key(vector< string > columns)
添加主键约束(ALTER TABLE ADD PRIMARY KEY)
sql_builder & page(int page_num, int page_size)
添加分页
sql_builder & select_count(string field)
添加COUNT聚合函数(无别名)
sql_builder & union_all(string query)
添加UNION ALL集合操作
sql_builder & cross_join(string table)
添加CROSS JOIN子句
sql_builder & select_subquery(string subquery)
添加子查询作为SELECT字段(无别名)
sql_builder & set_dialect(const sql_dialect dialect) noexcept
设置数据库方言
sql_builder & where_in(string field, vector< string > values)
添加IN条件
sql_builder & create_table(string table)
创建表
sql_builder & table_unique(vector< string > columns)
添加表级UNIQUE约束
sql_builder & select_ntile(int buckets, string alias, const vector< string > &partition_by={}, const vector< string > &order_by={})
添加NTILE窗口函数
sql_builder & column_unique(string name, string type)
添加带UNIQUE约束的列定义
sql_builder & column_check(string name, string type, string check_expr)
添加带CHECK约束的列定义
sql_builder & intersect(string query)
添加INTERSECT集合操作
sql_builder & create_index(string index_name, string table, vector< string > columns)
创建索引(CREATE INDEX)
sql_builder & alter_column_drop_default(string name)
删除列默认值(ALTER TABLE ALTER COLUMN DROP DEFAULT)
sql_builder & except_all(string query)
添加EXCEPT ALL集合操作
sql_builder & where_like(string field, string pattern)
添加LIKE条件
sql_builder & where_not_exists(string subquery)
添加NOT EXISTS条件
sql_builder & add_values(vector< string > values)
追加一行VALUES(用于多行INSERT)
static string make_case_simple(string field, vector< pair< string, string > > when_then, string else_val="")
构建简单CASE表达式(CASE field WHEN ... THEN ... ELSE ... END)
sql_builder & group_by_cube(vector< string > fields)
添加GROUP BY CUBE子句
string placeholder(const size_t index) const
生成方言感知的参数占位符
sql_builder & rename_column(string old_name, string new_name)
重命名列(ALTER TABLE RENAME COLUMN)
sql_builder & drop_view_if_exists(string view_name)
删除视图(IF EXISTS)
sql_builder & where_exists(string subquery)
添加EXISTS条件
sql_builder & where_is_not_null(string field)
添加IS NOT NULL条件
sql_builder & drop_index_if_exists(string index_name)
删除索引(DROP INDEX IF EXISTS)
sql_builder & group_by(string field)
添加GROUP BY字段
sql_builder & alter_column_set_not_null(string name)
设置列非空约束(ALTER TABLE ALTER COLUMN SET NOT NULL)
sql_builder & where_is_null(string field)
添加IS NULL条件
sql_builder & select_min(string field)
添加MIN聚合函数(无别名)
sql_builder & order_by(string field, sql_order order=sql_order::ASC)
添加ORDER BY子句
sql_operate type() const noexcept
获取当前SQL操作类型
sql_builder & select_distinct(string field)
添加DISTINCT字段
sql_builder & except_(string query)
添加EXCEPT集合操作
sql_builder & where_not_like(string field, string pattern)
添加NOT LIKE条件
sql_builder & drop_view(string view_name)
删除视图
sql_builder & drop_table(string table)
删除表
sql_builder & remove()
设置DELETE操作
sql_builder & select_subquery(string subquery, string alias)
添加子查询作为SELECT字段
sql_builder & set_increment(string field, int value=1)
添加自增赋值
sql_builder & create_temp_table_if_not_exists(string table)
创建临时表(TEMP TABLE IF NOT EXISTS)
sql_builder & values(vector< string > values)
设置VALUES占位符
static string make_case_searched(vector< pair< string, string > > when_then, string else_val="")
构建搜索CASE表达式(CASE WHEN condition THEN ... ELSE ... END)
sql_builder & where(string condition)
添加WHERE条件
sql_builder & set_decrement(string field, int value=1)
添加自减赋值
sql_builder & offset(int count)
添加OFFSET偏移
string build() const
构建最终的SQL语句
sql_builder & select_min(string field, string alias)
添加MIN聚合函数(带别名)
sql_builder & select_all() noexcept
选择所有字段(SELECT *)
sql_builder & select_sum(string field, string alias)
添加SUM聚合函数(带别名)
sql_builder & left_join(string table, string on_condition)
添加LEFT JOIN子句
sql_builder & select_count()
添加COUNT(*)聚合函数
sql_builder & select_rank(string alias, const vector< string > &partition_by={}, const vector< string > &order_by={})
添加RANK窗口函数
sql_builder & fetch_first(int row_count)
添加FETCH FIRST分页
sql_builder & from_subquery(string subquery, string alias)
使用子查询作为FROM表
sql_builder & select_lag(string field, string alias, const vector< string > &partition_by={}, const vector< string > &order_by={})
添加LAG窗口函数
sql_builder & drop_index(string index_name)
删除索引(DROP INDEX)
sql_builder & select_avg(string field, string alias)
添加AVG聚合函数(带别名)
sql_builder & alter_column_set_default(string name, string default_val)
设置列默认值(ALTER TABLE ALTER COLUMN SET DEFAULT)
sql_builder & select_row_number(string alias, const vector< string > &partition_by={}, const vector< string > &order_by={})
添加ROW_NUMBER窗口函数
sql_builder & or_where(string condition)
添加OR条件(与上一个条件组合)
sql_builder & select(vector< string > fields)
列表设置SELECT字段
sql_builder & column_primary_key(string name, string type)
添加PRIMARY KEY列定义
size_t param_count() const noexcept
获取当前语句的参数占位符数量
string next_placeholder()
获取下一个参数占位符
sql_builder & update(string table)
设置UPDATE表名
sql_builder & having(string condition)
添加HAVING条件
sql_builder & where_between(string field, string start, string end)
添加BETWEEN条件
sql_builder & select_avg(string field)
添加AVG聚合函数(无别名)
sql_builder & full_join(string table, string on_condition)
添加FULL JOIN子句
sql_builder & delete_from(string table)
设置DELETE FROM表名
sql_builder & alter_column_drop_not_null(string name)
删除列非空约束(ALTER TABLE ALTER COLUMN DROP NOT NULL)
sql_builder & drop_table_if_exists(string table)
删除表(IF EXISTS)
sql_builder & select_dense_rank(string alias, const vector< string > &partition_by={}, const vector< string > &order_by={})
添加DENSE_RANK窗口函数
sql_builder & insert_into(string table, vector< string > fields)
设置INSERT INTO表名和字段
sql_builder & drop_constraint(string constraint_name)
删除约束(ALTER TABLE DROP CONSTRAINT)
sql_builder & create_table_if_not_exists(string table)
创建表(IF NOT EXISTS)
sql_builder & drop_column(string name)
删除列(ALTER TABLE DROP COLUMN)
sql_builder & with_recursive(string name, string query)
添加递归CTE(WITH RECURSIVE子句)
sql_builder & inner_join(string table, string on_condition)
添加INNER JOIN子句
sql_builder & where_not_between(string field, string start, string end)
添加NOT BETWEEN条件
sql_builder & table_primary_key(vector< string > columns)
添加表级PRIMARY KEY约束
sql_builder & select_last_value(string field, string alias, const vector< string > &partition_by={}, const vector< string > &order_by={})
添加LAST_VALUE窗口函数
sql_builder & limit(int count)
添加LIMIT限制
sql_builder & set(string assignment)
添加SET赋值
sql_builder & where_not_in(string field, vector< string > values)
添加NOT IN条件
sql_builder & join(sql_join type, string table, string on_condition)
添加JOIN子句
sql_builder & alter_column_set_type(string name, string new_type)
修改列数据类型(ALTER TABLE ALTER COLUMN SET DATA TYPE)
sql_builder & create_temp_table(string table)
创建临时表(TEMP TABLE)
sql_builder & where_ne(string field, string value)
添加不等条件
sql_dialect dialect() const noexcept
获取当前数据库方言
独占智能指针
动态大小数组容器
unsigned char uint8_t
8位无符号整数类型
constexpr iter_difference_t< Iterator > count(Iterator first, Iterator last, const T &value)
统计范围内等于指定值的元素数量
@ MYSQL
MySQL数据库
@ POSTGRESQL
PostgreSQL数据库
sql_set_op
集合操作类型枚举
sql_operate
SQL操作类型枚举
sql_dialect
数据库方言
sql_join
JOIN类型枚举
sql_order
排序方向枚举
@ TRUNCATE
TRUNCATE TABLE截断表
@ CREATE_VIEW
CREATE VIEW创建视图
@ DROP_INDEX
DROP INDEX删除索引
@ DROP_TABLE
DROP TABLE删除表
@ CREATE_TABLE
CREATE TABLE建表
@ DROP_VIEW
DROP VIEW删除视图
@ ALTER_TABLE
ALTER TABLE修改表
@ CREATE_INDEX
CREATE INDEX创建索引
@ MSSQL
Microsoft SQL Server
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
basic_string_view< char > string_view
字符字符串视图
constexpr decltype(auto) end(Container &cont) noexcept(noexcept(cont.end()))
获取容器的结束迭代器
占位符预定义实例命名空间
字符串类型别名和实用函数
存储两个值的元组对
ALTER TABLE语句的数据结构
vector< string > actions
预组装的ALTER操作子句
bool auto_increment
AUTO_INCREMENT(事实标准)
CREATE INDEX语句的数据结构
CREATE TABLE语句的数据结构
bool temporary
是否创建临时表(TEMP TABLE)
bool if_not_exists
是否使用IF NOT EXISTS
vector< string > table_constraints
表级约束(预组装的SQL子句)
vector< column_definition > columns
列定义列表
CREATE VIEW语句的数据结构
CTE条目
string query
CTE查询SQL
bool recursive
是否递归CTE
string name
CTE名称
vector< string > fields
插入字段列表
vector< vector< string > > extra_rows
额外的多行VALUES(用于批量插入)
vector< string > rollup_fields
GROUP BY ROLLUP字段列表
vector< string > fields
查询字段列表
int fetch_count
FETCH FIRST 行数(SQL:2008分页)
vector< string > join_clauses
JOIN子句列表
vector< string > cube_fields
GROUP BY CUBE字段列表
vector< string > group_by_fields
GROUP BY字段列表
vector< string > having_conditions
HAVING条件列表
vector< string > order_by_clauses
ORDER BY子句列表
集合操作条目
string query
子查询SQL
sql_set_op op
集合操作类型
vector< string > assignments
赋值表达式列表
独占智能指针
动态大小数组容器