@asla/yoursql 0.6.5 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/mod.d.ts +2 -1
- package/dist/mod.js +206 -118
- package/dist/select/DbTable.d.ts +47 -0
- package/dist/select/TableQuery.d.ts +9 -52
- package/dist/select/_statement.d.ts +1 -0
- package/dist/select/_update_impl.d.ts +19 -0
- package/dist/select/{select.d.ts → query_link.d.ts} +29 -4
- package/dist/select/selectable.d.ts +0 -10
- package/dist/select/type.d.ts +2 -2
- package/dist/sql_value/sql_value.d.ts +0 -5
- package/package.json +1 -1
package/dist/mod.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
export * from "./sql_value/db_type.ts";
|
|
2
2
|
export * from "./sql_value/sql_value.ts";
|
|
3
3
|
export * from "./select/type.ts";
|
|
4
|
-
export * from "./select/
|
|
4
|
+
export * from "./select/DbTable.ts";
|
|
5
|
+
export * from "./select/query_link.ts";
|
|
5
6
|
export * from "./select/selectable.ts";
|
|
6
7
|
export * from "./select/TableQuery.ts";
|
|
7
8
|
export * from "./util.ts";
|
package/dist/mod.js
CHANGED
|
@@ -79,6 +79,45 @@ function condition(conditions, type = "AND") {
|
|
|
79
79
|
return;
|
|
80
80
|
}
|
|
81
81
|
}
|
|
82
|
+
function createUpdateSetFromObject(set) {
|
|
83
|
+
const updateKey = Object.keys(set);
|
|
84
|
+
let i = 0;
|
|
85
|
+
let key;
|
|
86
|
+
let value;
|
|
87
|
+
let sql;
|
|
88
|
+
for (; i < updateKey.length; i++) {
|
|
89
|
+
key = updateKey[i];
|
|
90
|
+
value = set[key];
|
|
91
|
+
if (value === undefined)
|
|
92
|
+
continue;
|
|
93
|
+
if (typeof value === "string") {
|
|
94
|
+
if (value) {
|
|
95
|
+
sql = "SET\n" + key + "= " + value;
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
else
|
|
100
|
+
throw new TypeError(`key ${key} 类型错误(${typeof value})`);
|
|
101
|
+
}
|
|
102
|
+
if (sql) {
|
|
103
|
+
i++;
|
|
104
|
+
for (; i < updateKey.length; i++) {
|
|
105
|
+
key = updateKey[i];
|
|
106
|
+
value = set[key];
|
|
107
|
+
if (value === undefined)
|
|
108
|
+
continue;
|
|
109
|
+
if (typeof value === "string") {
|
|
110
|
+
if (value)
|
|
111
|
+
sql += "," + key + "= " + value;
|
|
112
|
+
}
|
|
113
|
+
else
|
|
114
|
+
throw new TypeError(`key ${key} 类型错误(${typeof value})`);
|
|
115
|
+
}
|
|
116
|
+
return sql;
|
|
117
|
+
}
|
|
118
|
+
else
|
|
119
|
+
throw new Error("值不能为空");
|
|
120
|
+
}
|
|
82
121
|
|
|
83
122
|
/**
|
|
84
123
|
* 获取对象数组中的 key 的集合
|
|
@@ -249,22 +288,6 @@ var _SqlQueryStatement_sql;
|
|
|
249
288
|
*/
|
|
250
289
|
class SqlSelectable {
|
|
251
290
|
}
|
|
252
|
-
/**
|
|
253
|
-
* 数据库表
|
|
254
|
-
* @public
|
|
255
|
-
*/
|
|
256
|
-
class DbTable extends SqlSelectable {
|
|
257
|
-
constructor(name) {
|
|
258
|
-
super();
|
|
259
|
-
this.name = name;
|
|
260
|
-
}
|
|
261
|
-
toSelect() {
|
|
262
|
-
return this.name;
|
|
263
|
-
}
|
|
264
|
-
toString() {
|
|
265
|
-
return this.name;
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
291
|
/**
|
|
269
292
|
* SELECT 以及 UPDATE、DELETE、INSERT INTO 带结果的 SQL 语句
|
|
270
293
|
* @public
|
|
@@ -371,7 +394,10 @@ class SqlValuesCreator {
|
|
|
371
394
|
case "object": {
|
|
372
395
|
if (value instanceof String)
|
|
373
396
|
return value.toString();
|
|
374
|
-
|
|
397
|
+
const Class = this.getClassType(value);
|
|
398
|
+
if (Class)
|
|
399
|
+
return this._map.get(Class).call(this, value);
|
|
400
|
+
return this.defaultObject(value);
|
|
375
401
|
}
|
|
376
402
|
case "undefined":
|
|
377
403
|
return "DEFAULT";
|
|
@@ -643,10 +669,21 @@ class AfterSelectImpl extends SqlQueryStatement {
|
|
|
643
669
|
}
|
|
644
670
|
limit(limit, offset) {
|
|
645
671
|
let sql = this.toString();
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
672
|
+
let type;
|
|
673
|
+
if (limit) {
|
|
674
|
+
type = typeof limit;
|
|
675
|
+
if (type === "number" || type === "bigint")
|
|
676
|
+
sql += "\nLIMIT " + limit;
|
|
677
|
+
else
|
|
678
|
+
throw new TypeError("limit 必须是个整数:" + limit);
|
|
679
|
+
}
|
|
680
|
+
if (offset) {
|
|
681
|
+
type = typeof offset;
|
|
682
|
+
if (type === "number" || type === "bigint")
|
|
683
|
+
sql += "\nOFFSET " + offset;
|
|
684
|
+
else
|
|
685
|
+
throw new TypeError("offset 必须是个整数:" + limit);
|
|
686
|
+
}
|
|
650
687
|
return new SqlQueryStatement(sql);
|
|
651
688
|
}
|
|
652
689
|
}
|
|
@@ -708,93 +745,170 @@ _a = Selection, _Selection_sql = new WeakMap(), _Selection_instances = new WeakS
|
|
|
708
745
|
return new _a(sql);
|
|
709
746
|
};
|
|
710
747
|
|
|
711
|
-
|
|
712
|
-
class
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
748
|
+
var _AfterInsert_sql;
|
|
749
|
+
class AfterUpdateOrReturn extends SqlQueryStatement {
|
|
750
|
+
returning(returns) {
|
|
751
|
+
if (typeof returns === "function")
|
|
752
|
+
returns = returns();
|
|
753
|
+
let columnsStr;
|
|
754
|
+
if (returns === "*") {
|
|
755
|
+
columnsStr = "*";
|
|
756
|
+
}
|
|
757
|
+
else {
|
|
758
|
+
const res = selectColumnsOrTable(returns);
|
|
759
|
+
columnsStr = res.sqlColumns;
|
|
760
|
+
}
|
|
761
|
+
let sql = this.toString() + "\nRETURNING " + columnsStr;
|
|
762
|
+
return new SqlQueryStatement(sql);
|
|
763
|
+
}
|
|
764
|
+
onConflict(onConflict) {
|
|
765
|
+
if (typeof onConflict === "function")
|
|
766
|
+
onConflict = onConflict();
|
|
767
|
+
if (typeof onConflict !== "string")
|
|
768
|
+
onConflict = onConflict.join(",");
|
|
769
|
+
let sql = this.toString() + `\nON CONFLICT (${onConflict})`;
|
|
770
|
+
return new AfterInsert(sql);
|
|
771
|
+
}
|
|
772
|
+
where(where$1) {
|
|
773
|
+
const sql = where(where$1);
|
|
774
|
+
return new AfterUpdateOrReturn(this.toString() + sql);
|
|
775
|
+
}
|
|
776
|
+
}
|
|
777
|
+
class AfterInsert {
|
|
778
|
+
constructor(sql) {
|
|
779
|
+
_AfterInsert_sql.set(this, void 0);
|
|
780
|
+
__classPrivateFieldSet(this, _AfterInsert_sql, sql, "f");
|
|
781
|
+
}
|
|
782
|
+
doUpdate(set) {
|
|
783
|
+
if (typeof set === "function")
|
|
784
|
+
set = set();
|
|
785
|
+
let sql = this.toString();
|
|
786
|
+
if (typeof set === "object") {
|
|
787
|
+
sql += "\nDO UPDATE ";
|
|
788
|
+
sql += createUpdateSetFromObject(set);
|
|
789
|
+
}
|
|
790
|
+
else if (set)
|
|
791
|
+
sql += "DO UPDATE SET\n" + set;
|
|
792
|
+
else
|
|
793
|
+
sql += "DO NOTHING";
|
|
794
|
+
return new AfterUpdateOrReturn(sql);
|
|
795
|
+
}
|
|
796
|
+
doNotThing() {
|
|
797
|
+
return new AfterUpdateOrReturn(__classPrivateFieldGet(this, _AfterInsert_sql, "f") + " DO NOTHING");
|
|
798
|
+
}
|
|
799
|
+
toString() {
|
|
800
|
+
return __classPrivateFieldGet(this, _AfterInsert_sql, "f");
|
|
801
|
+
}
|
|
802
|
+
}
|
|
803
|
+
_AfterInsert_sql = new WeakMap();
|
|
804
|
+
|
|
805
|
+
/**
|
|
806
|
+
* 数据库表
|
|
807
|
+
* @public
|
|
808
|
+
*/
|
|
809
|
+
class DbTable extends SqlSelectable {
|
|
810
|
+
constructor(name) {
|
|
811
|
+
super();
|
|
812
|
+
this.name = name;
|
|
716
813
|
}
|
|
717
814
|
fromAs(as) {
|
|
718
|
-
return new Selection(this, as);
|
|
815
|
+
return new Selection(this.name, as);
|
|
719
816
|
}
|
|
720
817
|
select(columns, as) {
|
|
721
818
|
return this.fromAs(as).select(columns);
|
|
722
819
|
}
|
|
723
|
-
|
|
820
|
+
/**
|
|
821
|
+
* INSERT 语句,需要注意 SQL 注入
|
|
822
|
+
* @example
|
|
823
|
+
* ```ts
|
|
824
|
+
* table.insert(["age","name"], "VALUES (18, 'hi'), (17, 'hh')") // INSERT INTO table(age,name) VALUES(18, 'hi'), (17, 'hh')
|
|
825
|
+
* ```
|
|
826
|
+
*/
|
|
827
|
+
insert(columns, values) {
|
|
828
|
+
if (typeof columns !== "string" || !columns)
|
|
829
|
+
throw new TypeError("columns 必须是有效的 string 类型");
|
|
830
|
+
if (typeof values === "function")
|
|
831
|
+
values = values();
|
|
832
|
+
if (typeof values !== "string")
|
|
833
|
+
throw new TypeError("values 必须是 string 或 function 类型");
|
|
834
|
+
let sql = `INSERT INTO ${this.name}(${columns})\n${values}`;
|
|
835
|
+
return new AfterUpdateOrReturn(sql);
|
|
836
|
+
}
|
|
837
|
+
/**
|
|
838
|
+
* UPDATE 语句,需要注意 SQL 注入
|
|
839
|
+
* @example
|
|
840
|
+
* ```ts
|
|
841
|
+
* table.update("age=3, name='hi'") // "UPDATE table SET age=3, name='hi'"
|
|
842
|
+
* table.update({age: "3", name: "'hi'", k1: undefined, k2: ""}) // "UPDATE table SET age=3, name='hi'"
|
|
843
|
+
* ```
|
|
844
|
+
*/
|
|
845
|
+
update(values) {
|
|
724
846
|
if (typeof values === "function")
|
|
725
847
|
values = values();
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
if (typeof columns_option === "string")
|
|
731
|
-
columnStr = columns_option;
|
|
732
|
-
else if (columns_option instanceof Array) {
|
|
733
|
-
if (columns_option.length === 0)
|
|
734
|
-
throw new Error("插入列为空");
|
|
735
|
-
columnStr = columns_option.join(",");
|
|
848
|
+
switch (typeof values) {
|
|
849
|
+
case "object": {
|
|
850
|
+
let sql = createUpdateSetFromObject(values);
|
|
851
|
+
return new AfterUpdateOrReturn("UPDATE " + this.name + " " + sql);
|
|
736
852
|
}
|
|
737
|
-
|
|
738
|
-
|
|
853
|
+
case "string":
|
|
854
|
+
return new AfterUpdateOrReturn("UPDATE " + this.name + " SET\n" + values);
|
|
855
|
+
default:
|
|
856
|
+
throw new TypeError("参数 values 错误");
|
|
857
|
+
}
|
|
858
|
+
}
|
|
859
|
+
delete(option = {}) {
|
|
860
|
+
let sql = "DELETE FROM " + this.name;
|
|
861
|
+
sql += where(option.where);
|
|
862
|
+
return new AfterUpdateOrReturn(sql);
|
|
863
|
+
}
|
|
864
|
+
toSelect() {
|
|
865
|
+
return this.name;
|
|
866
|
+
}
|
|
867
|
+
toString() {
|
|
868
|
+
return this.name;
|
|
869
|
+
}
|
|
870
|
+
}
|
|
871
|
+
|
|
872
|
+
/** @public */
|
|
873
|
+
class DbTableQuery extends DbTable {
|
|
874
|
+
constructor(name, statement) {
|
|
875
|
+
super(name);
|
|
876
|
+
this.statement = statement;
|
|
877
|
+
}
|
|
878
|
+
insert(values_column, _values) {
|
|
879
|
+
if (_values)
|
|
880
|
+
return super.insert(values_column, _values);
|
|
881
|
+
let values = values_column;
|
|
882
|
+
if (typeof values === "function")
|
|
883
|
+
values = values();
|
|
884
|
+
if (typeof values !== "object")
|
|
885
|
+
throw new TypeError("values 类型错误");
|
|
886
|
+
let valuesStr;
|
|
887
|
+
let insertCol;
|
|
888
|
+
if (values instanceof Array) {
|
|
889
|
+
if (values.length === 0)
|
|
890
|
+
throw new Error("值不能为空");
|
|
891
|
+
insertCol = Array.from(getObjectListKeys(values));
|
|
892
|
+
valuesStr = `VALUES\n${this.statement.objectListToValuesList(values, insertCol)}`;
|
|
739
893
|
}
|
|
740
894
|
else {
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
if (typeof values === "object") {
|
|
744
|
-
if (values instanceof Array) {
|
|
745
|
-
if (values.length === 0)
|
|
746
|
-
throw new Error("值不能为空");
|
|
747
|
-
insertCol = Array.from(getObjectListKeys(values));
|
|
748
|
-
valuesStr = `VALUES\n${this.statement.objectListToValuesList(values, insertCol)}`;
|
|
749
|
-
}
|
|
750
|
-
else if (values instanceof SqlQueryStatement) {
|
|
751
|
-
// todo 验证 values.columns 和 this.columns 是否匹配
|
|
752
|
-
valuesStr = values.toString();
|
|
753
|
-
insertCol = values.columns;
|
|
754
|
-
}
|
|
755
|
-
else {
|
|
756
|
-
insertCol = Object.keys(values);
|
|
757
|
-
valuesStr = `VALUES\n(${this.statement.objectToValues(values, insertCol)})`;
|
|
758
|
-
}
|
|
759
|
-
}
|
|
760
|
-
else
|
|
761
|
-
throw new Error("values 应该是 Array 或 TableQuery 类型");
|
|
762
|
-
if (insertCol.length === 0)
|
|
763
|
-
throw new Error("插入列不能为空");
|
|
764
|
-
columnStr = insertCol.join(",");
|
|
895
|
+
insertCol = Object.keys(values);
|
|
896
|
+
valuesStr = `VALUES\n(${this.statement.objectToValues(values, insertCol)})`;
|
|
765
897
|
}
|
|
898
|
+
if (insertCol.length === 0)
|
|
899
|
+
throw new Error("插入列不能为空");
|
|
900
|
+
const columnStr = insertCol.join(",");
|
|
766
901
|
let sql = `INSERT INTO ${this.name} (${columnStr})\n${valuesStr}`;
|
|
767
|
-
|
|
768
|
-
let { updateValues, conflict, where: inputWhere } = option;
|
|
769
|
-
if (conflict) {
|
|
770
|
-
if (typeof conflict !== "string")
|
|
771
|
-
conflict = conflict.join(",");
|
|
772
|
-
sql += `\nON CONFLICT (${conflict})`;
|
|
773
|
-
if (typeof updateValues === "function")
|
|
774
|
-
updateValues = updateValues();
|
|
775
|
-
if (updateValues) {
|
|
776
|
-
const updateKey = Object.entries(updateValues);
|
|
777
|
-
sql += `\nDO UPDATE SET\n${updateKey.map(([key, v = "EXCLUDED." + key]) => key + " = " + v).join(",\n")}`;
|
|
778
|
-
}
|
|
779
|
-
else
|
|
780
|
-
sql += "DO NOTHING";
|
|
781
|
-
sql += where(inputWhere);
|
|
782
|
-
}
|
|
783
|
-
}
|
|
784
|
-
return sql;
|
|
785
|
-
}
|
|
786
|
-
insertWithResult(values, returns, columns, option) {
|
|
787
|
-
let sql = this.insert(values, columns, option);
|
|
788
|
-
return genRetuningSql(sql, returns);
|
|
902
|
+
return new AfterUpdateOrReturn(sql);
|
|
789
903
|
}
|
|
790
904
|
/**
|
|
905
|
+
* UPDATE 语句,与 update() 不同的是,它会将值进行安全转换
|
|
791
906
|
* @example
|
|
792
907
|
* ```ts
|
|
793
|
-
* table.update(
|
|
794
|
-
* table.update({age:3, name:"hi"}) // "UPDATE table SET age=3, name='hi'"
|
|
908
|
+
* table.update({age:3, name:"hi"}, true) // "UPDATE table SET age=3, name='hi'"
|
|
795
909
|
* ```
|
|
796
910
|
*/
|
|
797
|
-
|
|
911
|
+
updateFrom(values) {
|
|
798
912
|
if (typeof values === "function")
|
|
799
913
|
values = values();
|
|
800
914
|
let setStr;
|
|
@@ -806,41 +920,15 @@ class DbTableQuery extends DbTable {
|
|
|
806
920
|
for (const [k, v] of updateKey) {
|
|
807
921
|
if (v === undefined)
|
|
808
922
|
continue;
|
|
809
|
-
setList.push(k + "
|
|
923
|
+
setList.push(k + "= " + this.statement.toSqlStr(v));
|
|
810
924
|
}
|
|
811
925
|
setStr = setList.join(",\n");
|
|
812
926
|
}
|
|
813
927
|
if (!setStr)
|
|
814
928
|
throw new Error("值不能为空");
|
|
815
|
-
let sql = `UPDATE ${this.name}\
|
|
816
|
-
|
|
817
|
-
return sql;
|
|
818
|
-
}
|
|
819
|
-
updateWithResult(values, returns, option) {
|
|
820
|
-
let sql = this.update(values, option);
|
|
821
|
-
return genRetuningSql(sql, returns);
|
|
822
|
-
}
|
|
823
|
-
delete(option = {}) {
|
|
824
|
-
let sql = "DELETE FROM " + this.name;
|
|
825
|
-
sql += where(option.where);
|
|
826
|
-
return sql;
|
|
827
|
-
}
|
|
828
|
-
deleteWithResult(returns = "*", option) {
|
|
829
|
-
let sql = this.delete(option);
|
|
830
|
-
return genRetuningSql(sql, returns);
|
|
831
|
-
}
|
|
832
|
-
}
|
|
833
|
-
function genRetuningSql(sql, returns) {
|
|
834
|
-
let columnsStr;
|
|
835
|
-
if (returns === "*") {
|
|
836
|
-
columnsStr = "*";
|
|
837
|
-
}
|
|
838
|
-
else {
|
|
839
|
-
const res = selectColumnsOrTable(returns);
|
|
840
|
-
columnsStr = res.sqlColumns;
|
|
929
|
+
let sql = `UPDATE ${this.name} SET\n${setStr}`;
|
|
930
|
+
return new AfterUpdateOrReturn(sql);
|
|
841
931
|
}
|
|
842
|
-
sql += "\nRETURNING " + columnsStr;
|
|
843
|
-
return new SqlQueryStatement(sql);
|
|
844
932
|
}
|
|
845
933
|
|
|
846
934
|
/**
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { SqlSelectable } from "./selectable.ts";
|
|
2
|
+
import { ConditionParam, Constructable, SelectParam } from "../util.ts";
|
|
3
|
+
import type { TableType } from "./type.ts";
|
|
4
|
+
import { CurrentModifyWhere, CurrentOnConflict, CurrentWhere, Selection } from "./query_link.ts";
|
|
5
|
+
/**
|
|
6
|
+
* 数据库表
|
|
7
|
+
* @public
|
|
8
|
+
*/
|
|
9
|
+
export declare class DbTable<T extends TableType> extends SqlSelectable<T> {
|
|
10
|
+
readonly name: string;
|
|
11
|
+
constructor(name: string);
|
|
12
|
+
fromAs(as?: string): Selection;
|
|
13
|
+
/** 选择单表全部列 */
|
|
14
|
+
select(columns: "*", as?: string): CurrentWhere<T>;
|
|
15
|
+
/** 选择单表 */
|
|
16
|
+
select<R extends {}>(columns: Constructable<{
|
|
17
|
+
[key in keyof R]: boolean | string;
|
|
18
|
+
} | string>, as?: string): CurrentWhere<R>;
|
|
19
|
+
select<R extends {}>(columns: Constructable<SelectParam>): CurrentWhere<R>;
|
|
20
|
+
/**
|
|
21
|
+
* INSERT 语句,需要注意 SQL 注入
|
|
22
|
+
* @example
|
|
23
|
+
* ```ts
|
|
24
|
+
* table.insert(["age","name"], "VALUES (18, 'hi'), (17, 'hh')") // INSERT INTO table(age,name) VALUES(18, 'hi'), (17, 'hh')
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
insert(columns: string, values: Constructable<string>): CurrentOnConflict<T>;
|
|
28
|
+
/**
|
|
29
|
+
* UPDATE 语句,需要注意 SQL 注入
|
|
30
|
+
* @example
|
|
31
|
+
* ```ts
|
|
32
|
+
* table.update("age=3, name='hi'") // "UPDATE table SET age=3, name='hi'"
|
|
33
|
+
* table.update({age: "3", name: "'hi'", k1: undefined, k2: ""}) // "UPDATE table SET age=3, name='hi'"
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
update(values: Constructable<{
|
|
37
|
+
[key in keyof T]?: string;
|
|
38
|
+
} | string>): CurrentModifyWhere<T>;
|
|
39
|
+
delete(option?: DeleteOption): CurrentModifyWhere<T>;
|
|
40
|
+
toSelect(): string;
|
|
41
|
+
toString(): string;
|
|
42
|
+
}
|
|
43
|
+
/** @public */
|
|
44
|
+
export interface DeleteOption {
|
|
45
|
+
where?: Constructable<ConditionParam | void>;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=DbTable.d.ts.map
|
|
@@ -1,28 +1,12 @@
|
|
|
1
1
|
import { SqlValuesCreator } from "../sql_value/sql_value.ts";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { DbTable
|
|
5
|
-
import {
|
|
2
|
+
import { UpdateRowValue, TableType } from "./type.ts";
|
|
3
|
+
import { Constructable } from "../util.ts";
|
|
4
|
+
import { DbTable } from "./DbTable.ts";
|
|
5
|
+
import type { CurrentModifyWhere, CurrentOnConflict } from "./query_link.ts";
|
|
6
6
|
/** @public */
|
|
7
7
|
export declare class DbTableQuery<T extends TableType = Record<string, any>, C extends TableType = Partial<T>> extends DbTable<T> {
|
|
8
8
|
private statement;
|
|
9
9
|
constructor(name: string, statement: SqlValuesCreator);
|
|
10
|
-
fromAs(as?: string): Selection;
|
|
11
|
-
/** 选择单表全部列 */
|
|
12
|
-
select(columns: "*", as?: string): CurrentWhere<T>;
|
|
13
|
-
/**
|
|
14
|
-
* 选择单表
|
|
15
|
-
* @param columns - 对象选择
|
|
16
|
-
*/
|
|
17
|
-
select<R extends {
|
|
18
|
-
[key in keyof T]?: boolean;
|
|
19
|
-
}>(columns: Constructable<R>, as?: string): CurrentWhere<{
|
|
20
|
-
[key in keyof R]: key extends keyof T ? T[key] : unknown;
|
|
21
|
-
}>;
|
|
22
|
-
/** 选择单表- 所有类型 */
|
|
23
|
-
select<R extends {}>(columns: Constructable<{
|
|
24
|
-
[key in keyof R]?: key extends keyof T ? string | boolean : string;
|
|
25
|
-
} | string>, as?: string): CurrentWhere<R>;
|
|
26
10
|
/**
|
|
27
11
|
* @example
|
|
28
12
|
* ```ts
|
|
@@ -30,42 +14,15 @@ export declare class DbTableQuery<T extends TableType = Record<string, any>, C e
|
|
|
30
14
|
* table.insert([{age:18, name:"hi"}, {age:17, name:"hh"}]) // INSERT INTO table(age,name) VALUES(18, 'hi'), (17, 'hh')
|
|
31
15
|
* ```
|
|
32
16
|
*/
|
|
33
|
-
insert(values: Constructable<C | C[]
|
|
34
|
-
|
|
35
|
-
* @example
|
|
36
|
-
* ```ts
|
|
37
|
-
* table.insert("VALUES (18, 'hi'), (17, 'hh')", ["age","name"]) // INSERT INTO table(age,name) VALUES(18, 'hi'), (17, 'hh')
|
|
38
|
-
* ```
|
|
39
|
-
*/
|
|
40
|
-
insert(values: Constructable<string>, columns: string[], option?: InsertOption<T>): string;
|
|
41
|
-
insertWithResult<R extends ColumnsSelected<T>>(values: Constructable<C | C[]>, returns: R, option?: InsertOption<T>): SqlQueryStatement<SelectColumns<T, R>>;
|
|
42
|
-
insertWithResult<R extends ColumnsSelected<T>>(values: Constructable<string>, returns: R, columns: string | string[], option?: InsertOption<T>): SqlQueryStatement<SelectColumns<T, R>>;
|
|
17
|
+
insert(values: Constructable<UpdateRowValue<C> | UpdateRowValue<C>[]>): CurrentOnConflict<T>;
|
|
18
|
+
insert(columns: string, values: Constructable<string>): CurrentOnConflict<T>;
|
|
43
19
|
/**
|
|
20
|
+
* UPDATE 语句,与 update() 不同的是,它会将值进行安全转换
|
|
44
21
|
* @example
|
|
45
22
|
* ```ts
|
|
46
|
-
* table.update(
|
|
47
|
-
* table.update({age:3, name:"hi"}) // "UPDATE table SET age=3, name='hi'"
|
|
23
|
+
* table.update({age:3, name:"hi"}, true) // "UPDATE table SET age=3, name='hi'"
|
|
48
24
|
* ```
|
|
49
25
|
*/
|
|
50
|
-
|
|
51
|
-
updateWithResult<R extends ColumnsSelected<T>>(values: Constructable<UpdateRowValue<T>>, returns: R, option?: UpdateOption): SqlQueryStatement<SelectColumns<T, R>>;
|
|
52
|
-
delete(option?: DeleteOption): string;
|
|
53
|
-
deleteWithResult<R extends ColumnsSelected<T>>(returns?: ColumnsSelected<T> | "*", option?: DeleteOption): SqlQueryStatement<SelectColumns<T, R>>;
|
|
54
|
-
}
|
|
55
|
-
/** @public */
|
|
56
|
-
export interface InsertOption<T extends object> {
|
|
57
|
-
conflict?: (keyof T)[] | string;
|
|
58
|
-
updateValues?: Constructable<{
|
|
59
|
-
[key in keyof T]?: undefined | String | T[key];
|
|
60
|
-
} | string | void>;
|
|
61
|
-
where?: Constructable<ConditionParam | void>;
|
|
62
|
-
}
|
|
63
|
-
/** @public */
|
|
64
|
-
export interface UpdateOption {
|
|
65
|
-
where?: Constructable<ConditionParam | void>;
|
|
66
|
-
}
|
|
67
|
-
/** @public */
|
|
68
|
-
export interface DeleteOption {
|
|
69
|
-
where?: Constructable<ConditionParam | void>;
|
|
26
|
+
updateFrom(values: Constructable<UpdateRowValue<T>>): CurrentModifyWhere<T>;
|
|
70
27
|
}
|
|
71
28
|
//# sourceMappingURL=TableQuery.d.ts.map
|
|
@@ -8,5 +8,6 @@ type ConditionParam = string | string[];
|
|
|
8
8
|
* 生成条件语句
|
|
9
9
|
*/
|
|
10
10
|
export declare function condition(conditions?: Constructable<ConditionParam | void>, type?: "AND" | "OR"): string;
|
|
11
|
+
export declare function createUpdateSetFromObject(set: Record<string, string | undefined>): string;
|
|
11
12
|
export {};
|
|
12
13
|
//# sourceMappingURL=_statement.d.ts.map
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ConditionParam, Constructable } from "../util.ts";
|
|
2
|
+
import { CurrentModifyWhere, CurrentOnConflict, CurrentOnConflictDo, CurrentReturn } from "./query_link.ts";
|
|
3
|
+
import { SqlQueryStatement } from "./selectable.ts";
|
|
4
|
+
import { ColumnsSelected, TableType } from "./type.ts";
|
|
5
|
+
export declare class AfterUpdateOrReturn<T extends TableType = {}> extends SqlQueryStatement<{}> implements CurrentOnConflict<T>, CurrentModifyWhere<T> {
|
|
6
|
+
returning<R extends {}>(returns: Constructable<ColumnsSelected<any> | "*">): SqlQueryStatement<R>;
|
|
7
|
+
onConflict(onConflict: Constructable<readonly string[] | string>): CurrentOnConflictDo<T>;
|
|
8
|
+
where(where: Constructable<ConditionParam | void>): CurrentReturn<T>;
|
|
9
|
+
}
|
|
10
|
+
export declare class AfterInsert<T extends TableType = {}> implements CurrentOnConflictDo<T> {
|
|
11
|
+
#private;
|
|
12
|
+
constructor(sql: string);
|
|
13
|
+
doUpdate(set?: Constructable<string | {
|
|
14
|
+
[key: string]: string | undefined;
|
|
15
|
+
}>): CurrentModifyWhere<T>;
|
|
16
|
+
doNotThing(): CurrentReturn<T>;
|
|
17
|
+
toString(): string;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=_update_impl.d.ts.map
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { SqlSelectable, SqlQueryStatement } from "./selectable.ts";
|
|
2
2
|
import { OrderByParam, ConditionParam, SelectParam, Constructable } from "../util.ts";
|
|
3
|
-
import type { TableType } from "./type.ts";
|
|
3
|
+
import type { ColumnsSelected, SelectColumns, TableType } from "./type.ts";
|
|
4
4
|
/** @public */
|
|
5
5
|
export interface CurrentLimit<T extends TableType> extends SqlQueryStatement<T> {
|
|
6
|
-
limit(limit?: number, offset?: number): SqlQueryStatement<T>;
|
|
6
|
+
limit(limit?: number | bigint, offset?: number | bigint): SqlQueryStatement<T>;
|
|
7
7
|
}
|
|
8
8
|
/** @public */
|
|
9
9
|
export interface CurrentOrderBy<T extends TableType> extends CurrentLimit<T> {
|
|
@@ -54,6 +54,31 @@ export declare class Selection {
|
|
|
54
54
|
select<T extends TableType>(columns: Constructable<{
|
|
55
55
|
[key in keyof T]: string | boolean;
|
|
56
56
|
}>): CurrentWhere<T>;
|
|
57
|
-
select(columns: Constructable<SelectParam>): CurrentWhere<
|
|
57
|
+
select<R extends {}>(columns: Constructable<SelectParam>): CurrentWhere<R>;
|
|
58
58
|
}
|
|
59
|
-
|
|
59
|
+
/** @public */
|
|
60
|
+
export interface CurrentReturn<T extends TableType = {}> extends SqlQueryStatement<{}> {
|
|
61
|
+
returning(columns: "*"): SqlQueryStatement<T>;
|
|
62
|
+
returning<R extends ColumnsSelected<T>>(columns: Constructable<R>): SqlQueryStatement<SelectColumns<T, R>>;
|
|
63
|
+
returning<R extends TableType>(columns: Constructable<R | string>): SqlQueryStatement<T>;
|
|
64
|
+
}
|
|
65
|
+
/** @public */
|
|
66
|
+
export type CurrentModifyWhere<T extends TableType = {}> = CurrentReturn<T> & {
|
|
67
|
+
where(where: Constructable<ConditionParam | void>): CurrentReturn<T>;
|
|
68
|
+
};
|
|
69
|
+
/** @public */
|
|
70
|
+
export type CurrentOnConflictDo<T extends TableType = {}> = {
|
|
71
|
+
doNotThing(): CurrentReturn<T>;
|
|
72
|
+
/**
|
|
73
|
+
* 需要注意 SQL 注入
|
|
74
|
+
*/
|
|
75
|
+
doUpdate(set: Constructable<{
|
|
76
|
+
[key in keyof T]?: string;
|
|
77
|
+
}>): CurrentModifyWhere<T>;
|
|
78
|
+
toString(): string;
|
|
79
|
+
};
|
|
80
|
+
/** @public */
|
|
81
|
+
export type CurrentOnConflict<T extends TableType = {}> = CurrentReturn<T> & {
|
|
82
|
+
onConflict(option: Constructable<readonly (keyof T)[] | string>): CurrentOnConflictDo<T>;
|
|
83
|
+
};
|
|
84
|
+
//# sourceMappingURL=query_link.d.ts.map
|
|
@@ -22,16 +22,6 @@ export declare abstract class SqlSelectable<T extends TableType> {
|
|
|
22
22
|
/** 保留以推断类型 */
|
|
23
23
|
protected [SQL_SELECTABLE]: T;
|
|
24
24
|
}
|
|
25
|
-
/**
|
|
26
|
-
* 数据库表
|
|
27
|
-
* @public
|
|
28
|
-
*/
|
|
29
|
-
export declare class DbTable<T extends TableType> extends SqlSelectable<T> {
|
|
30
|
-
readonly name: string;
|
|
31
|
-
constructor(name: string);
|
|
32
|
-
toSelect(): string;
|
|
33
|
-
toString(): string;
|
|
34
|
-
}
|
|
35
25
|
/**
|
|
36
26
|
* SELECT 以及 UPDATE、DELETE、INSERT INTO 带结果的 SQL 语句
|
|
37
27
|
* @public
|
package/dist/select/type.d.ts
CHANGED
|
@@ -26,12 +26,12 @@ export type OrderValue = "ASC" | "DESC";
|
|
|
26
26
|
*/
|
|
27
27
|
export type ColumnsSelected<T extends TableType> = {
|
|
28
28
|
[key in keyof T]?: boolean | string;
|
|
29
|
-
}
|
|
29
|
+
};
|
|
30
30
|
/**
|
|
31
31
|
* 从一个表格选择列,生成新的表格类型
|
|
32
32
|
* @public
|
|
33
33
|
*/
|
|
34
|
-
export type SelectColumns<T extends TableType, R extends ColumnsSelected<T>> = R extends
|
|
34
|
+
export type SelectColumns<T extends TableType, R extends ColumnsSelected<T>> = R extends {
|
|
35
35
|
[key in keyof T]?: boolean | string;
|
|
36
36
|
} ? {
|
|
37
37
|
[key in keyof T as R[key] extends true ? key : StringOnly<R[key]>]: T[key];
|
|
@@ -14,11 +14,6 @@ export type JsObjectMapSql = Map<new (...args: any[]) => any, SqlValueEncoder>;
|
|
|
14
14
|
export type SqlValueEncoder<T = any> = (this: SqlValuesCreator, value: T) => string;
|
|
15
15
|
/** @public 断言类型 */
|
|
16
16
|
export type AssertJsType = "bigint" | "number" | "string" | "boolean" | "object" | (new (...args: any[]) => any);
|
|
17
|
-
/**
|
|
18
|
-
* @deprecated 改用 AssertJsType
|
|
19
|
-
* @public 断言类型
|
|
20
|
-
*/
|
|
21
|
-
export type ManualType = AssertJsType;
|
|
22
17
|
/** @public */
|
|
23
18
|
export type SqlValueFn = SqlValuesCreator & {
|
|
24
19
|
/**
|