@aicblock/emysql 1.3.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/LICENSE +21 -0
- package/README.en.md +71 -0
- package/README.md +71 -0
- package/lib/index.d.ts +35 -0
- package/lib/index.js +3 -0
- package/lib/types.d.ts +537 -0
- package/package.json +52 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 dpapejs
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.en.md
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# @aicblock/emysql
|
|
2
|
+
|
|
3
|
+

|
|
4
|
+

|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
#### Description
|
|
8
|
+
|
|
9
|
+
🛠️ Based on the basic secondary package of `mysql`, the pursuit of creating a simple and easy to use `mysql-ORM` library.
|
|
10
|
+
|
|
11
|
+
#### Installation
|
|
12
|
+
|
|
13
|
+
```sh
|
|
14
|
+
npm i @aicblock/emysql@latest -S
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
#### Instructions
|
|
18
|
+
|
|
19
|
+
```ts
|
|
20
|
+
import emysql, { DefineTable } from '@aicblock/emysql' // Reference library
|
|
21
|
+
// Function instantiation
|
|
22
|
+
const mysql = new emysql({
|
|
23
|
+
password: '[database login password]',
|
|
24
|
+
user: '[database login username]',
|
|
25
|
+
database: 'database name'
|
|
26
|
+
})
|
|
27
|
+
// Create table structure
|
|
28
|
+
const createTable = DefineTable({
|
|
29
|
+
tableName: 'create_table',
|
|
30
|
+
columns: [
|
|
31
|
+
{
|
|
32
|
+
name: 'id',
|
|
33
|
+
dataType: 'INT',
|
|
34
|
+
primaryKey: true,
|
|
35
|
+
autoIncrement: true,
|
|
36
|
+
comments: '主键id'
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'name',
|
|
40
|
+
dataType: 'VARCHAR',
|
|
41
|
+
length: 45,
|
|
42
|
+
notNull: true,
|
|
43
|
+
comments: '名称'
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
name: 'create_at',
|
|
47
|
+
dataType: 'DATETIME',
|
|
48
|
+
notNull: true,
|
|
49
|
+
comments: '创建时间'
|
|
50
|
+
}
|
|
51
|
+
]
|
|
52
|
+
}
|
|
53
|
+
})
|
|
54
|
+
// Initialize database
|
|
55
|
+
await mysql.init()
|
|
56
|
+
// Create table
|
|
57
|
+
await mysql.table.create([createTable])
|
|
58
|
+
// Insert data
|
|
59
|
+
const now = new Date()
|
|
60
|
+
await mysql.change.insert({
|
|
61
|
+
t: createTable,
|
|
62
|
+
params: { name: 'test', create_at: now }
|
|
63
|
+
})
|
|
64
|
+
// Query data
|
|
65
|
+
const list = await mysql.query({
|
|
66
|
+
t: createTable,
|
|
67
|
+
fields: ['name', 'id'],
|
|
68
|
+
condition: { id: 1 }
|
|
69
|
+
})
|
|
70
|
+
console.log(list) // [{id:1,name:"test"}]
|
|
71
|
+
```
|
package/README.md
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# @aicblock/emysql
|
|
2
|
+
|
|
3
|
+

|
|
4
|
+

|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
#### 介绍
|
|
8
|
+
|
|
9
|
+
🛠️ 基于 `mysql` 基础二次封装,追求打造简单、好用的 `mysql-ORM` 库.
|
|
10
|
+
|
|
11
|
+
#### 安装教程
|
|
12
|
+
|
|
13
|
+
```sh
|
|
14
|
+
npm i @aicblock/emysql@latest -S
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
#### 使用说明
|
|
18
|
+
|
|
19
|
+
```ts
|
|
20
|
+
import emysql, { DefineTable } from '@aicblock/emysql' // 引用库
|
|
21
|
+
// 函数实例化
|
|
22
|
+
const mysql = new emysql({
|
|
23
|
+
password: '[database login password]',
|
|
24
|
+
user: '[database login username]',
|
|
25
|
+
database: 'database name'
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
// 创建表结构
|
|
29
|
+
const createTable = DefineTable({
|
|
30
|
+
tableName: 'create_table',
|
|
31
|
+
columns: [
|
|
32
|
+
{
|
|
33
|
+
name: 'id',
|
|
34
|
+
dataType: 'INT',
|
|
35
|
+
primaryKey: true,
|
|
36
|
+
autoIncrement: true,
|
|
37
|
+
comments: '主键id'
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
name: 'name',
|
|
41
|
+
dataType: 'VARCHAR',
|
|
42
|
+
length: 45,
|
|
43
|
+
notNull: true,
|
|
44
|
+
comments: '名称'
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: 'create_at',
|
|
48
|
+
dataType: 'DATETIME',
|
|
49
|
+
notNull: true,
|
|
50
|
+
comments: '创建时间'
|
|
51
|
+
}
|
|
52
|
+
]
|
|
53
|
+
})
|
|
54
|
+
// 初始化数据库
|
|
55
|
+
await mysql.init()
|
|
56
|
+
// 创建表
|
|
57
|
+
await mysql.table.create([createTable])
|
|
58
|
+
// 插入数据
|
|
59
|
+
const now = new Date()
|
|
60
|
+
await mysql.change.insert({
|
|
61
|
+
t: createTable,
|
|
62
|
+
params: { name: 'test', create_at: now }
|
|
63
|
+
})
|
|
64
|
+
// 查询数据
|
|
65
|
+
const list = await mysql.query({
|
|
66
|
+
t: createTable,
|
|
67
|
+
fields: ['name', 'id'],
|
|
68
|
+
condition: { id: 1 }
|
|
69
|
+
})
|
|
70
|
+
console.log(list) // [{id:1,name:"test"}]
|
|
71
|
+
```
|
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/// <reference types="./types" />
|
|
2
|
+
import type { QueryResult, ResultSetHeader } from 'mysql2/promise';
|
|
3
|
+
import mysql from 'mysql2/promise';
|
|
4
|
+
declare class emysql {
|
|
5
|
+
db?: string;
|
|
6
|
+
log: 'none' | 'error' | 'warn' | 'info' | 'debug';
|
|
7
|
+
private pool?;
|
|
8
|
+
private conf;
|
|
9
|
+
constructor(param: EMsqlInstantiate & {
|
|
10
|
+
connConfig: mysql.PoolOptions;
|
|
11
|
+
});
|
|
12
|
+
private check_db;
|
|
13
|
+
init(): Promise<void>;
|
|
14
|
+
private create_conn;
|
|
15
|
+
detail(param: ExecQueryBaseParam): Promise<Record<string, any>>;
|
|
16
|
+
query(param: ExecQueryParam): Promise<Record<string, any>[]>;
|
|
17
|
+
count(param: QueryCountParam): Promise<number>;
|
|
18
|
+
change: {
|
|
19
|
+
insert: (v: InsertParam) => Promise<ResultSetHeader>;
|
|
20
|
+
delete: (v: DeleteParam) => Promise<ResultSetHeader>;
|
|
21
|
+
update: (v: UpdateParam) => Promise<ResultSetHeader>;
|
|
22
|
+
batchUpdate: (v: BatchUpdateParam<DuplicateUpdateParam | ConditionBatchUpdateParam>) => Promise<ResultSetHeader>;
|
|
23
|
+
};
|
|
24
|
+
transaction(exec: (v: TransactionParams<DuplicateUpdateParam | ConditionBatchUpdateParam, ResultSetHeader, QueryResult>) => Promise<any>): Promise<any>;
|
|
25
|
+
table: {
|
|
26
|
+
create: (v: DefineTableResult | DefineTableResult[]) => Promise<void>;
|
|
27
|
+
truncate: (name: string) => Promise<void>;
|
|
28
|
+
drop: (name: string) => Promise<void>;
|
|
29
|
+
exist: (name: string) => Promise<boolean>;
|
|
30
|
+
};
|
|
31
|
+
close(): Promise<void>;
|
|
32
|
+
}
|
|
33
|
+
export declare const DefineTable: (param: DefineTableParam) => DefineTableResult;
|
|
34
|
+
export declare const version: string;
|
|
35
|
+
export default emysql;
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";var oe=Object.create;var $=Object.defineProperty;var se=Object.getOwnPropertyDescriptor;var ae=Object.getOwnPropertyNames;var ie=Object.getPrototypeOf,ce=Object.prototype.hasOwnProperty;var le=(r,t)=>{for(var e in t)$(r,e,{get:t[e],enumerable:!0})},G=(r,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of ae(t))!ce.call(r,o)&&o!==e&&$(r,o,{get:()=>t[o],enumerable:!(n=se(t,o))||n.enumerable});return r};var ue=(r,t,e)=>(e=r!=null?oe(ie(r)):{},G(t||!r||!r.__esModule?$(e,"default",{value:r,enumerable:!0}):e,r)),pe=r=>G($({},"__esModule",{value:!0}),r);var Oe={};le(Oe,{DefineTable:()=>Ie,default:()=>Fe,version:()=>Ce});module.exports=pe(Oe);var K=ue(require("mysql2/promise")),me=async r=>{try{let t=K.default.createPool(r);return process.on("SIGINT",async()=>{t==null||t.end(),process.env.NODE_ENV!=="test"&&process.exit(0)}),(await t.getConnection()).release(),t}catch(t){return Promise.reject(t)}},Q=me;var J=(m=>(m.EQUAL="=",m.IN="IN",m.NOT_IN="NOT IN",m.LIKE="LIKE",m.LIKE_UPPER="LIKE",m.LIKE_LOWER="LIKE",m.NOT="!=",m.IS_NOT_NULL="IS NOT NULL",m.IS_NULL="IS NULL",m.GREATER_THAN_OR_EQUAL=">=",m.GREATER_THAN=">",m.LESS_THAN_OR_EQUAL="<=",m.LESS_THAN="<",m))(J||{}),V=(n=>(n["="]="?",n.IN="(?)",n["NOT IN"]="(?)",n.LIKE="?",n.NOT="?",n[">="]="?",n[">"]="?",n["<="]="?",n["<"]="?",n))(V||{});function S(r){let t=Array.isArray(r)&&r.length!==0,e=!Array.isArray(r)&&r!==void 0&&r!==null&&r!=="";return t||e}function W(r,t){let e=[`\`${r}\``];typeof t=="string"?e.push(`\`${t}\``):e.push(`\`${t.name}\``);let n=[e.join(".")];return typeof t!="string"&&t.alias&&n.push("AS",`\`${t.alias}\``),n.join(" ")}function he(r,t){let e=["SELECT"],n=de(t.fields);e.push(n.join(",")),e.push("FROM");let o=fe(r,t.t);e.push(o);let{where:s,values:a}=t.condition&&x(r,t.condition)||{};return t.join&&e.push(ye(r,t.join).join(`
|
|
2
|
+
`)),s&&(s==null?void 0:s.length)>0&&e.push("WHERE",...s),t.orderBy&&e.push(...Y(t.orderBy)),t.limit&&e.push(...D(t.limit)),{sql:e.join(" "),values:a}}function x(r,t){let e=[],n=[],o=[],s=[],a=Object.keys(t),c=(p,d)=>{let i=typeof d=="string"?{value:d}:d,{value:f,type:m,or:g,t:j,subquery:q}=i,R;if(q){let E=q.fields||[p],{sql:h,values:y}=he(r,Object.assign({},q,{fields:E}));o.push(...y),R=h}else if(!["IS_NOT_NULL","IS_NULL"].includes(m||""))if((m==="IN"||m==="NOT_IN")&&Array.isArray(f)){let E=f;g?s.push(...E):o.push(...E)}else g?s.push(f):m!=="TO_DAYS"&&o.push(f);let b=[],_=j&&`\`${j}\`.\`${p}\``||`\`${p}\``;if(m==="TO_DAYS")b.push(`TO_DAYS(${_})`,"=","TO_DAYS(NOW())");else{let E=m&&J[m]||"=";if(b.push(_,E),!["IS_NOT_NULL","IS_NULL"].includes(m||""))if(R)b.push(`(${R})`);else if((m==="IN"||m==="NOT_IN")&&Array.isArray(f)){let h=f.map(()=>"?").join(",");b.push(`(${h})`)}else b.push(V[E]||"?")}let A=b.join(" ");g&&n.push(A)||e.push(A)};a.forEach(p=>{let d=t[p];(typeof d!=="object"?[{value:d,type:"EQUAL"}]:Array.isArray(d)?d:[d]).forEach(m=>c(p,m))});let u=[e.join(" AND ")];return n.length>0&&(e.length>0&&n.length>1&&u.push(" AND "),e.length>0&&n.length===1&&u.push(" OR "),u.push(`(${n.join(" OR ")})`)),{where:u.filter(p=>S(p)),values:o.concat(s)}}function de(r){return r?(Array.isArray(r)?r:[r]).map(n=>{let o=typeof n=="string"?{name:n}:n,a=[o.t?`\`${o.t}\`.\`${o.name}\``:`\`${o.name}\``];return o.alias&&a.push("AS",`\`${o.alias}\``),a.join(" ")}):["*"]}function fe(r,t){return(Array.isArray(t)?t:[t]).map(o=>W(r,o)).join(",")}function ye(r,t){return(Array.isArray(t)?t:[t]).map(o=>{let{type:s,on:a}=o,{name:c,alias:u}=typeof o.t=="string"?{name:o.t,alias:void 0}:o.t,p=W(r,o.t),d=s==="LEFT"?"LEFT JOIN":s==="RIGHT"?"RIGHT JOIN":"INNER JOIN",i=u?[`\`${u}\``,`\`${a.joinField}\``]:[`\`${c}\``,`\`${a.joinField}\``],f=[`\`${a.mainTable}\``,`\`${a.mainField}\``];return[d,p,"ON",i.join("."),"=",f.join(".")].join(" ")})}function Y(r){let{field:t,type:e,t:n}=r,o=["ORDER BY"];return n?o.push([l(n),l(t)].join(".")):o.push(t),e&&o.push(e),o}var D=r=>["LIMIT",[r.start.toString(),",",r.length.toFixed()].join("")],l=r=>`\`${r}\``;function _e(r){let e=Object.assign({},{charset:"utf8mb4",collate:"utf8mb4_0900_bin",engine:"InnoDB"},r),n=[],{tableName:o,columns:s,engine:a,charset:c,collate:u}=e;n.push(l(o));let p=s.filter(i=>i.primaryKey),d=s.map(i=>{let f=[];f.push(l(i.name));let m=i.dataType,g=m;if(m==="DECIMAL"&&i.length&&i.point?g=`${m}(${i.length},${i.point})`:i.length&&(g=`${m}(${i.length})`),f.push(g),i.primaryKey&&(p.length===1?f.push("PRIMARY KEY","NOT NULL"):f.push("NOT NULL")),i.autoIncrement&&f.push("AUTO_INCREMENT"),i.notNull&&!i.primaryKey&&f.push("NOT NULL"),i.unique&&f.push("UNIQUE"),S(i.defaultValue)){let j=i.defaultValue,q=typeof j=="string"&&!j.startsWith("CURRENT_")?`'${j}'`:j;f.push("DEFAULT",q)}return S(i.comments)&&f.push(`COMMENT '${i.comments}'`),f.join(" ")});return p.length>1&&d.push(["PRIMARY KEY",`(${p.map(i=>l(i.name)).join(",")})`].join(" ")),n.push(`(${d.join(",")})`),n.push(`ENGINE=${a}`),n.push(`DEFAULT CHARSET=${c}`),n.push(`COLLATE=${u}`),n.join(" ")}async function X(r,t,e){try{let s=["TRUNCATE TABLE",[l(r),l(e)].join(".")].join(" ");return await t.query(s),Promise.resolve()}catch(n){return t.release(),Promise.reject(n)}}async function z(r,t,e){try{let s=["DROP TABLE IF EXISTS",[l(r),l(e)].join(".")].join(" ");return await t.query(s),Promise.resolve()}catch(n){return t.release(),Promise.reject(n)}}async function Z(r,t,e){try{let n=`SHOW TABLES IN ${l(r)} LIKE ?`,o=[e],[s]=await t.query({sql:n,values:o});return s.length===0?Promise.resolve(!1):Promise.resolve(!0)}catch(n){return t.release(),Promise.reject(n)}}var v=async(r,t,e)=>{try{let o=(Array.isArray(e)?e:[e]).map(a=>{let c=["CREATE TABLE IF NOT EXISTS"];return c.push([l(r),a.createSQL].join(".")),c.join(" ")}),s=a=>t.query(a);await Promise.all(o.map(s))}catch(n){return t.release(),Promise.reject(n)}},ee=r=>{let{tableName:t}=r,e=r.columns.map(u=>u.name),n={charset:"utf8mb4",collate:"utf8mb4_0900_bin",engine:"InnoDB"},{charset:o,collate:s,engine:a}=Object.assign({},n,r);return{name:t,createSQL:_e(r),fields:e,columns:r.columns,tableCharacter:{charset:o,collate:s,engine:a}}};var te=r=>(Array.isArray(r)?r:[r]).map(n=>{let o=typeof n=="string"?{name:n}:n,s=[];o.t&&s.push(o.t),s.push(o.name);let c=[s.map(l).join(".")];return o.alias&&c.push("AS",l(o.alias)),c.join(" ")}),P=(r,t)=>{let e=[];return(Array.isArray(t)?t:[t]).forEach(o=>{let a=[[l(r),l(o.name)].join(".")];o.alias&&a.push("AS",l(o.alias)),e.push(a.join(" "))}),e.join(",")},ge=(r,t)=>{let e=Array.isArray(t)?t:[t],n=[];return e.forEach(o=>{let{type:s,t:a,on:c}=o,u=s==="LEFT"?"LEFT JOIN":s==="RIGHT"?"RIGHT JOIN":"INNER JOIN",p=P(r,a),d=[u,p,"ON"],i=[];i.push(a.alias?l(a.alias):l(a.name),l(c.joinField)),d.push(i.join("."),"=");let f=[];f.push(c.mainTable.alias?l(c.mainTable.alias):l(c.mainTable.name),l(c.mainField)),d.push(f.join(".")),n.push(d.join(" "))}),n};function w(r){let t=["SELECT"];t.push(r.escape_fields.join(",")),t.push("FROM"),t.push(P(r.db,r.t));let e,n;if(r.condition&&Object.keys(r.condition).length>0){let s=x(r.db,r.condition);e=s.where,n=s.values}return r.join&&t.push(ge(r.db,r.join).join(`
|
|
3
|
+
`)),e&&e.length>0&&t.push("WHERE",...e),r.orderBy&&t.push(...Y(r.orderBy)),r.limit&&t.push(...D(r.limit)),{sql:t.join(" "),values:n}}var Pe=async(r,t,e)=>{try{let[n,o]=await r.query({sql:t,values:e});return{data:n,fields:o}}catch(n){return r.release(),Promise.reject(n)}},I=Pe;var je=(r,t,e)=>{let n=[],o=Array.isArray(r)?r:[r];if(o.forEach(c=>{n.push(...c.fields.map(u=>{let p=[];return(o.length>1||e)&&p.push(l(c.alias||c.name)),p.push(l(u)),p.join(".")}))}),e&&(Array.isArray(e)?e:[e]).forEach(u=>{let p=u.t;typeof p!="string"&&p.fields&&n.push(...p.fields.map(d=>{let i=[];return i.push(l(p.alias||p.name)),i.push(l(d)),i.join(".")}))}),!t)return n;if(!(Array.isArray(t)?t:[t]).every(c=>{let u=typeof c=="string"?{name:c}:c,p=[];u.t&&p.push(u.t),p.push(u.name);let d=p.map(l).join(".");return n.includes(d)}))throw new Error("fields not found");return te(t)},qe=async(r,t,e)=>{try{let n=je(e.t,e.fields,e.join),{sql:o,values:s}=w({...e,db:t,escape_fields:n});console.info("[info] sql query::",o);let{data:a}=await I(r,o,s);return a}catch(n){return r.release(),Promise.reject(n)}},L=qe;var H=r=>{let t=Array.isArray(r)?r:[r],e=Array.from(new Set(t.map(o=>Object.keys(o)).flat())).map(o=>l(o)),n=t.map(o=>e.map(s=>{let a=s.replace(/`/g,"");return a in o?o[a]:null}));return{fields:e,values:n}},Ee=(r,t)=>{let e=["INSERT INTO"],n="table"in t.t?t.t.table.name:t.t.name,o=[l(r),l(n)];e.push(o.join("."));let s="table"in t.t?t.t.alias:void 0;s&&e.push("AS",l(s));let{fields:a,values:c}=H(t.params),u=["("].concat(a.join(",")).concat(")");return e.push(u.join(""),"VALUES"),e.push("?"),{sql:e.join(" "),values:[c]}},be=async(r,t,e)=>{try{let{sql:n,values:o}=Ee(r,e);console.info("[info] sql insert::",n);let[s]=await t.query({sql:n,values:o});return s}catch(n){return t.release(),Promise.reject(n)}},C=be;var Te=async(r,t,e)=>{var n,o;try{let s=typeof e.field=="string"?e.field:((n=e.field)==null?void 0:n.name)||"id",a=[];typeof e.field=="object"&&e.field.t&&(e.field.t.alias?a.push(l(e.field.t.alias)):a.push(l(e.field.t.name))),a.push(l(s));let c=[`COUNT(${a.join(".")}) AS total`],{sql:u,values:p}=w({...e,db:t,escape_fields:c});console.info("[info] sql query::",u);let{data:d}=await I(r,u,p);return((o=d[0])==null?void 0:o.total)||0}catch(s){return r.release(),Promise.reject(s)}},F=Te;var Re=async(r,t,e)=>{try{if(!e.condition||Object.keys(e.condition).length===0)throw Error("The deletion condition cannot be empty.");let n=["DELETE FROM",P(r,e.t)],{where:o,values:s}=x(r,e.condition),a=n.concat("WHERE").concat(o).join(" ");console.info("[info] sql delte::",a);let[c]=await t.execute({sql:a,values:s});return c}catch(n){return t.release(),Promise.reject(n)}},O=Re;var Ae=async(r,t,e)=>{try{if(!e.params||Object.keys(e.params).length===0)throw Error("The update params cannot be empty.");if(!e.condition||Object.keys(e.condition).length===0)throw Error("The update condition cannot be empty.");let n=["UPDATE",P(r,e.t),"SET"],{fields:o,values:s}=H(e.params);n.push(o.map(i=>`${i}=?`).join(","));let{where:a,values:c}=x(r,e.condition),u=n.concat("WHERE").concat(a).join(" ");console.info("[info] sql update::",u);let p=[...s[0],...c],[d]=await t.query({sql:u,values:p});return d}catch(n){return t.release(),Promise.reject(n)}},U=Ae;var Se=(r,t)=>{let{t:e,unique:n,excludeField:o}=t,s=t.data,a=["INSERT INTO",P(r,e)],c=Array.isArray(s),u=Array.isArray(s)?s:[s],d=Array.from(new Set(u.map(_=>Object.keys(_)).flat())).map(_=>l(_)),i=u.map(_=>d.map(A=>{let E=A.replace(/`/g,"");return E in _?_[E]:null})),f=["("].concat(d.join(","),")");a.push(f.join(""),"VALUES");let m=d.map(()=>"?"),g=["("].concat(m.join(",")).concat(")");c?a.push("?"):a.push(g.join(""));let j=[n||"id"].concat(o||[]),q=d.filter(_=>{let A=_.replace(/`/g,"");return!j.includes(A)}).map(_=>`${_} = VALUES(${_})`).join(",");a.push("ON DUPLICATE KEY UPDATE",q);let R=a.join(" "),b=c?[i]:i[0];return{sql:R,values:b}},xe=(r,t)=>{let{t:e,conditionField:n}=t,o=t.data,s=["UPDATE",P(r,e),"SET"],a={},c=[];Array.from(new Set(o.map(i=>Object.keys(i)).flat())).filter(i=>i!==n).forEach(i=>{let f=[];o.forEach(m=>{i in m&&(f.push(["WHEN","?","THEN","?"]),c.push(m[n],m[i]))}),a[i]=f}),Object.keys(a).forEach((i,f,m)=>{let g=a[i].map(q=>q.join(" ")).join(" "),j=[l(i),"=","CASE",n,g,"END"];m.length-1!==f&&j.push(","),s.push(...j)}),s.push("WHERE",n,"IN","?");let p=o.map(i=>i[n]);c.push([p]);let d=s.join(" ");return{values:c,sql:d}},Le=(r,t)=>{let{t:e}=t,{charset:n,collate:o,engine:s}=e.tableCharacter,a=t.data;if(!t.conditionField)throw Error("PARAM_ERROR::[CONDITIONFIELD] IS NOT NULL");let c=["temp_",e.name].join(""),u=Array.from(new Set(a.map(h=>Object.keys(h)).flat()));console.info("[info] allFields::",u);let p=u.map(h=>e.columns.find(y=>y.name===h)).filter(h=>h!==void 0),d=p.filter(h=>h.primaryKey),i=p.map(h=>{let y=[];y.push(l(h.name));let T=h.dataType,M=T;if(T==="DECIMAL"&&h.length&&h.point?M=`${T}(${h.length},${h.point})`:h.length&&(M=`${T}(${h.length})`),y.push(M),h.primaryKey&&(d.length===1?y.push("PRIMARY KEY","NOT NULL"):y.push("NOT NULL")),h.autoIncrement&&y.push("AUTO_INCREMENT"),h.notNull&&!h.primaryKey&&y.push("NOT NULL"),h.unique&&y.push("UNIQUE"),S(h.defaultValue)){let N=h.defaultValue,ne=typeof N=="string"&&!N.startsWith("CURRENT_")?`'${N}'`:N;y.push("DEFAULT",ne)}return S(h.comments)&&y.push(`COMMENT '${h.comments}'`),y.join(" ")}),f=["CREATE TEMPORARY TABLE IF NOT EXISTS",l(c),`(${i.join(",")})`,`ENGINE=${s}`,`DEFAULT CHARSET=${n}`,`COLLATE=${o}`].join(" ");console.info("[info] sql create temporary table::",f);let m={name:c,createSQL:f,fields:u,columns:e.columns,tableCharacter:{charset:n,collate:o,engine:s}},g=["INSERT INTO",l(c)],j=u.map(h=>l(h)).join(",");g.push("(",j,") VALUES");let q=a.map(h=>`(${u.map(T=>T in h?h[T]:null).map(()=>"?").join(",")})`).join(",");g.push(q);let R=a.flatMap(h=>u.map(y=>y in h?h[y]:null)),b={sql:g.join(" "),values:R},_=["UPDATE",P(r,e),"JOIN",P(r,m),"ON",`${P(r,e)}.${l(t.conditionField)}`,"=",`${P(r,m)}.${l(t.conditionField)}`,"SET"];return u.filter(h=>h!==t.conditionField).forEach((h,y,T)=>{_.push(`${P(r,e)}.${l(h)}`,"=",`${P(r,m)}.${l(h)}`),T.length-1!==y&&_.push(",")}),{create:{values:[],sql:f},insert:b,update:{values:[],sql:_.join(" ")},drop:{values:[],sql:["DROP TEMPORARY TABLE IF EXISTS",l(c)].join(" ")}}},we=async(r,t,e)=>{try{if(!e.params)throw new Error("params is required");if(e.type==="TEMPORARY"){let a=e.params,{create:c,insert:u,update:p,drop:d}=Le(r,a);console.info("[info] sql temporary batch create::",c.sql),await t.query(c),console.info("[info] sql temporary batch insert::",u.sql),await t.query(u),console.info("[info] sql temporary batch update::",p.sql);let[i]=await t.query(p);return await t.query(d),i}let{values:n,sql:o}=e.type==="DUPLICATE"?Se(r,e.params):xe(r,e.params);console.info("[info] sql batch update::",o);let[s]=await t.query({sql:o,values:n});return s}catch(n){return t.release(),Promise.reject(n)}},B=we;var Ne=(r,t)=>{let e=async(o,s,a)=>{try{console.info("[info] trx::sql query::",s);let[c]=await o.query(s,a);return c}catch(c){return Promise.reject(c)}};return{sql:(o,s)=>e(t,o,s),query:o=>L(t,r,o),detail:async o=>{try{return(await L(t,r,Object.assign({},o,{limit:{start:0,length:1}})))[0]}catch(s){return Promise.reject(s)}},count:o=>F(t,r,o),change:{insert:o=>C(r,t,o),batchUpdate:o=>B(r,t,o),delete:o=>O(r,t,o),update:o=>U(r,t,o)}}},$e=async(r,t,e)=>{try{await t.beginTransaction();let n=Ne(r,t);console.info("[info] transaction exec list");let o=await e(n);return await t.commit(),o}catch(n){return await t.rollback(),t.release(),Promise.reject(n)}},re=$e;var k=class{constructor(t){this.log="none";this.pool=void 0;this.conf={};this.change={insert:async t=>{try{this.check_db();let e=await this.create_conn(),n=await C(this.db,e,t);return e.release(),n}catch(e){return this.log==="error"&&console.error(e),Promise.reject(e)}},delete:async t=>{try{this.check_db();let e=await this.create_conn(),n=await O(this.db,e,t);return e.release(),n}catch(e){return this.log==="error"&&console.error(e),Promise.reject(e)}},update:async t=>{try{this.check_db();let e=await this.create_conn(),n=await U(this.db,e,t);return e.release(),n}catch(e){return this.log==="error"&&console.error(e),Promise.reject(e)}},batchUpdate:async t=>{try{this.check_db();let e=await this.create_conn(),n=await B(this.db,e,t);return e.release(),n}catch(e){return this.log==="error"&&console.error(e),Promise.reject(e)}}};this.table={create:async t=>{try{let e=await this.create_conn();return this.check_db(),await v(this.db,e,t),e.release(),Promise.resolve()}catch(e){return this.log==="error"&&console.error(e),Promise.reject(e)}},truncate:async t=>{try{this.check_db();let e=await this.create_conn();return await X(this.db,e,t),e.release(),Promise.resolve()}catch(e){return this.log==="error"&&console.error(e),Promise.reject(e)}},drop:async t=>{try{this.check_db();let e=await this.create_conn();return await z(this.db,e,t),e.release(),Promise.resolve()}catch(e){return this.log==="error"&&console.error(e),Promise.reject(e)}},exist:async t=>{try{this.check_db();let e=await this.create_conn(),n=await Z(this.db,e,t);return e.release(),Promise.resolve(n)}catch(e){return this.log==="error"&&console.error(e),Promise.reject(e)}}};if(this.log=t.log||"none",!t.connConfig)throw Error("CONN_CONFIG_REQUIRED");this.db=t.connConfig.database,this.conf=t.connConfig}check_db(){if(!this.db)throw this.log==="error"&&console.error("The database name is not initialized. Procedure"),Error("DB_UNINITIALIZED")}async init(){try{if(this.pool)return;this.pool=await Q(this.conf)}catch(t){throw this.log==="error"&&console.error(t),Error("CREATE_POOL_FAILED")}}async create_conn(){try{return this.pool?await this.pool.getConnection():(this.log==="error"&&console.error("The connection pool is not initialized. Procedure"),Promise.reject("POOL_UNINITIALIZED"))}catch(t){return Promise.reject(t)}}async detail(t){try{this.check_db();let e=await this.create_conn(),n=await L(e,this.db,Object.assign({},t,{limit:{start:0,length:1}}));return e.release(),n[0]}catch(e){return this.log==="error"&&console.error(e),Promise.reject(e)}}async query(t){try{this.check_db();let e=await this.create_conn(),n=await L(e,this.db,t);return e.release(),n}catch(e){return this.log==="error"&&console.error(e),Promise.reject(e)}}async count(t){try{this.check_db();let e=await this.create_conn(),n=await F(e,this.db,t);return e.release(),n}catch(e){return this.log==="error"&&console.error(e),Promise.reject(e)}}async transaction(t){try{this.check_db();let e=await this.create_conn(),n=await re(this.db,e,t);return e.release(),n}catch(e){return this.log==="error"&&console.error(e),Promise.reject(e)}}async close(){var t;try{return await((t=this.pool)==null?void 0:t.end()),this.pool=void 0,Promise.resolve()}catch(e){return this.log==="error"&&console.error(e),Promise.reject(e)}}},Ie=ee,Ce=`1.3.0:${Date.now()}`,Fe=k;0&&(module.exports={DefineTable,version});
|
package/lib/types.d.ts
ADDED
|
@@ -0,0 +1,537 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 表参数配置
|
|
3
|
+
*/
|
|
4
|
+
interface TableConfig {
|
|
5
|
+
/**
|
|
6
|
+
* 表名
|
|
7
|
+
*/
|
|
8
|
+
name: string
|
|
9
|
+
/**
|
|
10
|
+
* 表别名
|
|
11
|
+
*/
|
|
12
|
+
alias?: string
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* 表信息类型
|
|
17
|
+
*/
|
|
18
|
+
type TABLE_TYPE = DefineTableResult & { alias?: string }
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* 表信息配置项
|
|
22
|
+
*/
|
|
23
|
+
type TABLE_OPTION = TABLE_TYPE | TABLE_TYPE[]
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* 查询等式类型
|
|
27
|
+
*/
|
|
28
|
+
type CONDITION_EQUATION_TYPE =
|
|
29
|
+
| 'EQUAL' // 等于
|
|
30
|
+
| 'TO_DAYS' // 转换为天数
|
|
31
|
+
| 'IN' // 包含
|
|
32
|
+
| 'NOT_IN' // 不包含
|
|
33
|
+
| 'LIKE' // 模糊查询
|
|
34
|
+
| 'LIKE_UPPER' // 转大写查询
|
|
35
|
+
| 'LIKE_LOWER' // 转小写查询
|
|
36
|
+
| 'NOT' // 不等于
|
|
37
|
+
| 'IS_NOT_NULL' // 不为空
|
|
38
|
+
| 'IS_NULL' // 为空
|
|
39
|
+
| 'GREATER_THAN_OR_EQUAL' // 大于等于
|
|
40
|
+
| 'GREATER_THAN' // 大于
|
|
41
|
+
| 'LESS_THAN_OR_EQUAL' // 小于等于
|
|
42
|
+
| 'LESS_THAN' // 小于
|
|
43
|
+
| 'LESS_THAN' // 小于
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* 值类型
|
|
47
|
+
*/
|
|
48
|
+
type VALUE_TYPE = string | number | Date | boolean | VALUE_TYPE[]
|
|
49
|
+
|
|
50
|
+
interface ConditionOption {
|
|
51
|
+
/**
|
|
52
|
+
* 匹配值
|
|
53
|
+
*/
|
|
54
|
+
value?: VALUE_TYPE
|
|
55
|
+
/**
|
|
56
|
+
* 等式类型
|
|
57
|
+
*/
|
|
58
|
+
type?: CONDITION_EQUATION_TYPE
|
|
59
|
+
/**
|
|
60
|
+
* 是否为或语句
|
|
61
|
+
*/
|
|
62
|
+
or?: boolean
|
|
63
|
+
/**
|
|
64
|
+
* 表名或表别名
|
|
65
|
+
*/
|
|
66
|
+
t?: string
|
|
67
|
+
/**
|
|
68
|
+
* 子查询
|
|
69
|
+
*/
|
|
70
|
+
subquery?: ExecQueryParam
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* 查询条件配置项
|
|
75
|
+
*/
|
|
76
|
+
type CONDITION_TYPE = Record<
|
|
77
|
+
string,
|
|
78
|
+
VALUE_TYPE | ConditionOption | ConditionOption[]
|
|
79
|
+
>
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* 查询条目区间配置项
|
|
83
|
+
*/
|
|
84
|
+
interface LIMIT_PARAM {
|
|
85
|
+
/**
|
|
86
|
+
* 开始位置
|
|
87
|
+
*/
|
|
88
|
+
start: number
|
|
89
|
+
/**
|
|
90
|
+
* 查询数量
|
|
91
|
+
*/
|
|
92
|
+
length: number
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* 表连接查询配置项
|
|
97
|
+
*/
|
|
98
|
+
interface JOIN_PARAM_TYPE {
|
|
99
|
+
/**
|
|
100
|
+
* 连接方式,默认:INNER JOIN
|
|
101
|
+
*/
|
|
102
|
+
type?: 'LEFT' | 'RIGHT' | 'INNER'
|
|
103
|
+
/**
|
|
104
|
+
* 连接表配置信息
|
|
105
|
+
*/
|
|
106
|
+
t: TABLE_TYPE
|
|
107
|
+
/**
|
|
108
|
+
* 连接条件配置信息
|
|
109
|
+
*/
|
|
110
|
+
on: {
|
|
111
|
+
/**
|
|
112
|
+
* 连接字段名
|
|
113
|
+
*/
|
|
114
|
+
joinField: string
|
|
115
|
+
/**
|
|
116
|
+
* 主表字段名
|
|
117
|
+
*/
|
|
118
|
+
mainField: string
|
|
119
|
+
/**
|
|
120
|
+
* 主表表名或表别名
|
|
121
|
+
*/
|
|
122
|
+
mainTable: TABLE_TYPE
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* 排序配置项
|
|
128
|
+
*/
|
|
129
|
+
interface OrderByParam {
|
|
130
|
+
/**
|
|
131
|
+
* 数据库字段名
|
|
132
|
+
*/
|
|
133
|
+
field: string
|
|
134
|
+
/**
|
|
135
|
+
* 排序类型
|
|
136
|
+
* ASC | 升序
|
|
137
|
+
* DESC | 降序
|
|
138
|
+
*/
|
|
139
|
+
type?: 'ASC' | 'DESC'
|
|
140
|
+
/**
|
|
141
|
+
* 表名或表别名
|
|
142
|
+
*/
|
|
143
|
+
t?: string
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* 字段配置项
|
|
148
|
+
*/
|
|
149
|
+
interface FIELD_OPTION {
|
|
150
|
+
/**
|
|
151
|
+
* 字段名
|
|
152
|
+
*/
|
|
153
|
+
name: string
|
|
154
|
+
/**z
|
|
155
|
+
* 字段别名
|
|
156
|
+
*/
|
|
157
|
+
alias?: string
|
|
158
|
+
/**
|
|
159
|
+
* 表名或表别名
|
|
160
|
+
*/
|
|
161
|
+
t?: string
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* 字段配置类型
|
|
166
|
+
*/
|
|
167
|
+
type FIELDS_OPTION = string | FIELD_OPTION | (FIELD_OPTION | string)[]
|
|
168
|
+
|
|
169
|
+
interface ExecQueryBaseParam {
|
|
170
|
+
/**
|
|
171
|
+
* 表信息
|
|
172
|
+
*/
|
|
173
|
+
t: TABLE_OPTION
|
|
174
|
+
/**
|
|
175
|
+
* 查询条件
|
|
176
|
+
*/
|
|
177
|
+
condition?: CONDITION_TYPE
|
|
178
|
+
/**
|
|
179
|
+
* 查询字段
|
|
180
|
+
*/
|
|
181
|
+
fields?: FIELDS_OPTION
|
|
182
|
+
/**
|
|
183
|
+
* 表连接查询配置信息
|
|
184
|
+
*/
|
|
185
|
+
join?: JOIN_PARAM_TYPE | JOIN_PARAM_TYPE[]
|
|
186
|
+
/**
|
|
187
|
+
* 排序
|
|
188
|
+
*/
|
|
189
|
+
orderBy?: OrderByParam
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* 查询字段配置
|
|
194
|
+
*/
|
|
195
|
+
interface COUNT_FIELD_OPTION {
|
|
196
|
+
/**
|
|
197
|
+
* 字段名
|
|
198
|
+
*/
|
|
199
|
+
name: string
|
|
200
|
+
/**
|
|
201
|
+
* 表名或表别名
|
|
202
|
+
*/
|
|
203
|
+
t?: TABLE_TYPE
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
interface QueryCountParam {
|
|
207
|
+
/**
|
|
208
|
+
* 表信息
|
|
209
|
+
*/
|
|
210
|
+
t: TABLE_OPTION
|
|
211
|
+
/**
|
|
212
|
+
* 查询条件
|
|
213
|
+
*/
|
|
214
|
+
condition?: CONDITION_TYPE
|
|
215
|
+
/**
|
|
216
|
+
* 统计字段
|
|
217
|
+
*/
|
|
218
|
+
field?: string | COUNT_FIELD_OPTION
|
|
219
|
+
/**
|
|
220
|
+
* 表连接查询配置信息
|
|
221
|
+
*/
|
|
222
|
+
join?: JOIN_PARAM_TYPE | JOIN_PARAM_TYPE[]
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* 执行查询参数
|
|
227
|
+
*/
|
|
228
|
+
interface ExecQueryParam extends ExecQueryBaseParam {
|
|
229
|
+
/**
|
|
230
|
+
* 查询条目区间
|
|
231
|
+
*/
|
|
232
|
+
limit?: LIMIT_PARAM
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* SQL查询语句转换参数
|
|
237
|
+
*/
|
|
238
|
+
interface SQLConvertQueryParam extends ExecQueryParam {
|
|
239
|
+
/**
|
|
240
|
+
* 数据库名称
|
|
241
|
+
*/
|
|
242
|
+
db: string
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
interface EMsqlInstantiate {
|
|
246
|
+
/**
|
|
247
|
+
* 日志等级
|
|
248
|
+
*/
|
|
249
|
+
log?: 'none' | 'error' | 'warn' | 'info' | 'debug'
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* 表字段类型
|
|
254
|
+
*/
|
|
255
|
+
type COLUMN_DATA_TYPE =
|
|
256
|
+
| 'INT'
|
|
257
|
+
| 'BINARY'
|
|
258
|
+
| 'BIGINT'
|
|
259
|
+
| 'BIT'
|
|
260
|
+
| 'BLOB'
|
|
261
|
+
| 'CHAR'
|
|
262
|
+
| 'DATE'
|
|
263
|
+
| 'DATETIME'
|
|
264
|
+
| 'DECIMAL'
|
|
265
|
+
| 'DOUBLE'
|
|
266
|
+
| 'ENUM'
|
|
267
|
+
| 'FLOAT'
|
|
268
|
+
| 'GEOMETRY'
|
|
269
|
+
| 'GEOMETRYCOLLECTION'
|
|
270
|
+
| 'INTEGER'
|
|
271
|
+
| 'JSON'
|
|
272
|
+
| 'LINESTRING'
|
|
273
|
+
| 'LONGBLOB'
|
|
274
|
+
| 'LONGTEXT'
|
|
275
|
+
| 'MEDIUMBLOB'
|
|
276
|
+
| 'MEDIUMINT'
|
|
277
|
+
| 'MEDIUMTEXT'
|
|
278
|
+
| 'MULTILINESTRING'
|
|
279
|
+
| 'MULTIPOINT'
|
|
280
|
+
| 'MULTIPOLYGON'
|
|
281
|
+
| 'NUMERIC'
|
|
282
|
+
| 'POINT'
|
|
283
|
+
| 'POLYGON'
|
|
284
|
+
| 'REAL'
|
|
285
|
+
| 'SET'
|
|
286
|
+
| 'SMALLINT'
|
|
287
|
+
| 'TEXT'
|
|
288
|
+
| 'TIME'
|
|
289
|
+
| 'TIMESTAMP'
|
|
290
|
+
| 'TINYBLOB'
|
|
291
|
+
| 'TINYINT'
|
|
292
|
+
| 'TINYTEXT'
|
|
293
|
+
| 'VARBINARY'
|
|
294
|
+
| 'VARCHAR'
|
|
295
|
+
| 'YEAR'
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* 表字段配置信息
|
|
299
|
+
*/
|
|
300
|
+
interface ColumnOption {
|
|
301
|
+
name: string
|
|
302
|
+
dataType: COLUMN_DATA_TYPE
|
|
303
|
+
length?: number
|
|
304
|
+
point?: number
|
|
305
|
+
primaryKey?: boolean
|
|
306
|
+
notNull?: boolean
|
|
307
|
+
unique?: boolean
|
|
308
|
+
unsigned?: boolean
|
|
309
|
+
zeroFill?: boolean
|
|
310
|
+
autoIncrement?: boolean
|
|
311
|
+
comments?: string
|
|
312
|
+
defaultValue?: any
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/**
|
|
316
|
+
* mysql 存储引擎
|
|
317
|
+
*/
|
|
318
|
+
type TABLE_ENGINE =
|
|
319
|
+
| 'InnoDB'
|
|
320
|
+
| 'MyISAM'
|
|
321
|
+
| 'MEMORY'
|
|
322
|
+
| 'PERFORMANCE_SCHEMA'
|
|
323
|
+
| 'MRG_MYISAM'
|
|
324
|
+
| 'BLACKHOLE'
|
|
325
|
+
| 'CSV'
|
|
326
|
+
| 'ARCHIVE'
|
|
327
|
+
|
|
328
|
+
/**
|
|
329
|
+
* 定义数据表参数
|
|
330
|
+
*/
|
|
331
|
+
interface DefineTableParam {
|
|
332
|
+
/**
|
|
333
|
+
* 表名
|
|
334
|
+
*/
|
|
335
|
+
tableName: string
|
|
336
|
+
/**
|
|
337
|
+
* 表字段
|
|
338
|
+
*/
|
|
339
|
+
columns: ColumnOption[]
|
|
340
|
+
/**
|
|
341
|
+
* 定义存储文本数据时使用的编码. default: utf8mb4
|
|
342
|
+
*/
|
|
343
|
+
charset?: string
|
|
344
|
+
/**
|
|
345
|
+
* 定义字符排序和比较规则的关键字. default: utf8mb4_0900_bin
|
|
346
|
+
*/
|
|
347
|
+
collate?: string
|
|
348
|
+
/**
|
|
349
|
+
* 存储引擎. default: InnoDB
|
|
350
|
+
*/
|
|
351
|
+
engine?: TABLE_ENGINE
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
interface tableCharacterParam {
|
|
355
|
+
charset: string
|
|
356
|
+
collate: string
|
|
357
|
+
engine: TABLE_ENGINE
|
|
358
|
+
}
|
|
359
|
+
interface DefineTableResult {
|
|
360
|
+
/**
|
|
361
|
+
* 表名
|
|
362
|
+
*/
|
|
363
|
+
name: string
|
|
364
|
+
/**
|
|
365
|
+
* 创建表语句
|
|
366
|
+
*/
|
|
367
|
+
createSQL: string
|
|
368
|
+
/**
|
|
369
|
+
* 表字段列表
|
|
370
|
+
*/
|
|
371
|
+
fields: string[]
|
|
372
|
+
/**
|
|
373
|
+
* 表字段配置信息
|
|
374
|
+
*/
|
|
375
|
+
columns: ColumnOption[]
|
|
376
|
+
/**
|
|
377
|
+
* 表字符集配置
|
|
378
|
+
*/
|
|
379
|
+
tableCharacter: tableCharacterParam
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
interface InsertParam {
|
|
383
|
+
/**
|
|
384
|
+
* 表信息
|
|
385
|
+
*/
|
|
386
|
+
t: DefineTableResult | { table: DefineTableResult; alias?: string }
|
|
387
|
+
/**
|
|
388
|
+
* 插入数据
|
|
389
|
+
*/
|
|
390
|
+
params: Record<string, any> | Record<string, any>[]
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
interface DeleteParam {
|
|
394
|
+
/**
|
|
395
|
+
* 表名
|
|
396
|
+
*/
|
|
397
|
+
t: TABLE_TYPE
|
|
398
|
+
/**
|
|
399
|
+
* 删除条件
|
|
400
|
+
*/
|
|
401
|
+
condition: CONDITION_TYPE
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
interface UpdateParam {
|
|
405
|
+
/**
|
|
406
|
+
* 表信息
|
|
407
|
+
*/
|
|
408
|
+
t: TABLE_TYPE
|
|
409
|
+
/**
|
|
410
|
+
* 更新数据
|
|
411
|
+
*/
|
|
412
|
+
params: Record<string, any>
|
|
413
|
+
/**
|
|
414
|
+
* 更新条件
|
|
415
|
+
*/
|
|
416
|
+
condition: CONDITION_TYPE
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
/**
|
|
420
|
+
* 批量更新参数|唯一索引键更新
|
|
421
|
+
*/
|
|
422
|
+
interface DuplicateUpdateParam {
|
|
423
|
+
/**
|
|
424
|
+
* 表信息
|
|
425
|
+
*/
|
|
426
|
+
t: TABLE_TYPE
|
|
427
|
+
/**
|
|
428
|
+
* 配置参数
|
|
429
|
+
*/
|
|
430
|
+
data: Record<string, any>[]
|
|
431
|
+
/**
|
|
432
|
+
* 唯一索引字段名
|
|
433
|
+
*/
|
|
434
|
+
unique?: string
|
|
435
|
+
/**
|
|
436
|
+
* 不更新字段
|
|
437
|
+
*/
|
|
438
|
+
excludeField?: string | string[]
|
|
439
|
+
/**
|
|
440
|
+
* 更新条件
|
|
441
|
+
*/
|
|
442
|
+
condition?: CONDITION_TYPE
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
/**
|
|
446
|
+
* 批量更新参数|条件更新
|
|
447
|
+
*/
|
|
448
|
+
interface ConditionBatchUpdateParam {
|
|
449
|
+
/**
|
|
450
|
+
* 表信息
|
|
451
|
+
*/
|
|
452
|
+
t: TABLE_TYPE
|
|
453
|
+
/**
|
|
454
|
+
* 条件字段
|
|
455
|
+
*/
|
|
456
|
+
conditionField: string
|
|
457
|
+
/**
|
|
458
|
+
* 数据
|
|
459
|
+
*/
|
|
460
|
+
data: Record<string, any>[]
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
interface BatchUpdateParam<
|
|
464
|
+
T extends DuplicateUpdateParam | ConditionBatchUpdateParam
|
|
465
|
+
> {
|
|
466
|
+
type: 'DUPLICATE' | 'CASE_WHEN' | 'TEMPORARY'
|
|
467
|
+
params: T
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
interface TransactionChange<T, ResultSetHeader> {
|
|
471
|
+
/**
|
|
472
|
+
* 执行数据插入语句
|
|
473
|
+
*
|
|
474
|
+
* Execute the data insert statement
|
|
475
|
+
*/
|
|
476
|
+
insert(v: InsertParam): Promise<ResultSetHeader>
|
|
477
|
+
/**
|
|
478
|
+
* 执行数据批量更新语句
|
|
479
|
+
*
|
|
480
|
+
* Execute data batch update statements
|
|
481
|
+
*/
|
|
482
|
+
batchUpdate(v: T): Promise<ResultSetHeader>
|
|
483
|
+
/**
|
|
484
|
+
* 执行数据删除语句
|
|
485
|
+
*
|
|
486
|
+
* Execute a data delete statement
|
|
487
|
+
*/
|
|
488
|
+
delete(v: DeleteParam): Promise<ResultSetHeader>
|
|
489
|
+
/**
|
|
490
|
+
* 执行数据更新语句
|
|
491
|
+
*
|
|
492
|
+
* Execute the data update statement
|
|
493
|
+
*/
|
|
494
|
+
update(v: UpdateParam): Promise<ResultSetHeader>
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
/**
|
|
498
|
+
* 事务参数配置
|
|
499
|
+
*/
|
|
500
|
+
interface TransactionParams<
|
|
501
|
+
T extends DuplicateUpdateParam | ConditionBatchUpdateParam,
|
|
502
|
+
ResultSetHeader,
|
|
503
|
+
QueryResult
|
|
504
|
+
> {
|
|
505
|
+
/**
|
|
506
|
+
* 执行原SQL语句
|
|
507
|
+
*
|
|
508
|
+
* Execute query statement
|
|
509
|
+
* @param param 参数值
|
|
510
|
+
* @returns
|
|
511
|
+
*/
|
|
512
|
+
sql(sql: string, param?: VALUE_TYPE): Promise<QueryResult>
|
|
513
|
+
/**
|
|
514
|
+
* 执行查询语句
|
|
515
|
+
*
|
|
516
|
+
* Execute query statement
|
|
517
|
+
* @param v 配置参数信息
|
|
518
|
+
* @returns
|
|
519
|
+
*/
|
|
520
|
+
query(v: ExecQueryParam): Promise<Record<string, any>[]>
|
|
521
|
+
/**
|
|
522
|
+
* 执行查询数据详情语句
|
|
523
|
+
*
|
|
524
|
+
* Execute the statement to query data details
|
|
525
|
+
* @param v 参数信息
|
|
526
|
+
*/
|
|
527
|
+
detail(v: ExecQueryBaseParam): Promise<Record<string, any> | undefined>
|
|
528
|
+
/**
|
|
529
|
+
* 获取数据总数
|
|
530
|
+
* @param v 参数信息
|
|
531
|
+
*/
|
|
532
|
+
count(v: QueryCountParam): Promise<number>
|
|
533
|
+
/**
|
|
534
|
+
* 数据更新函数
|
|
535
|
+
*/
|
|
536
|
+
change: TransactionChange<BatchUpdateParam<T>, ResultSetHeader>
|
|
537
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@aicblock/emysql",
|
|
3
|
+
"version": "1.3.0",
|
|
4
|
+
"description": "🛠️ Based on the basic secondary package of `mysql`, the pursuit of creating a simple and easy to use `mysql-ORM` library.",
|
|
5
|
+
"main": "lib/index.js",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"package": "ts-node ./scripts/build.ts",
|
|
8
|
+
"doc": "npm run -C ./doc dev",
|
|
9
|
+
"doc:build": "npm run -C ./doc build",
|
|
10
|
+
"changelog": "conventional-changelog -p angular -i CHANGELOG.md -s -r 1",
|
|
11
|
+
"test": "jest --coverage",
|
|
12
|
+
"prepare": "husky"
|
|
13
|
+
},
|
|
14
|
+
"repository": {
|
|
15
|
+
"type": "git",
|
|
16
|
+
"url": "https://gitee.com/aiclouddigit/e-mysql"
|
|
17
|
+
},
|
|
18
|
+
"homepage": "http://emysql.aicblock.cn/",
|
|
19
|
+
"keywords": [
|
|
20
|
+
"MYSQL",
|
|
21
|
+
"AICBLOCKCN",
|
|
22
|
+
"ORM",
|
|
23
|
+
"nodejs",
|
|
24
|
+
"mysql-orm"
|
|
25
|
+
],
|
|
26
|
+
"files": [
|
|
27
|
+
"lib"
|
|
28
|
+
],
|
|
29
|
+
"author": "jieyang;damon;",
|
|
30
|
+
"license": "MIT",
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"@commitlint/cli": "^19.6.0",
|
|
33
|
+
"@commitlint/config-conventional": "^19.6.0",
|
|
34
|
+
"@dpapejs/node-utils": "^0.1.0",
|
|
35
|
+
"@types/jest": "^27.5.2",
|
|
36
|
+
"@types/node": "^16.4.10",
|
|
37
|
+
"conventional-changelog-cli": "^5.0.0",
|
|
38
|
+
"esbuild": "^0.21.3",
|
|
39
|
+
"husky": "^9.1.7",
|
|
40
|
+
"jest": "^27.5.1",
|
|
41
|
+
"ts-jest": "^27.1.3",
|
|
42
|
+
"ts-node": "^10.9.2"
|
|
43
|
+
},
|
|
44
|
+
"husky": {
|
|
45
|
+
"hooks": {
|
|
46
|
+
"commit-msg": "commitlint -E HUSKY_GIT_PARAMS,"
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
"dependencies": {
|
|
50
|
+
"mysql2": "^3.14.1"
|
|
51
|
+
}
|
|
52
|
+
}
|