@mlagie/sql-connector 1.4.9 → 1.5.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/.github/ISSUE_TEMPLATE/bug_report.md +43 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +29 -0
- package/README.md +260 -44
- package/docs/fr/README.md +204 -20
- package/index.d.ts +16 -45
- package/package.json +2 -2
- package/releases/1.5.0.md +127 -0
- package/src/models/Model.js +47 -100
- package/src/models/ModelInstance.js +59 -8
- package/src/utils/buildQuery.js +73 -0
- package/src/utils/generateCondition.js +1 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Bug report
|
|
3
|
+
about: Create a report to help us improve
|
|
4
|
+
title: ''
|
|
5
|
+
labels: ''
|
|
6
|
+
assignees: lagie-marin
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Bug Description
|
|
11
|
+
|
|
12
|
+
## Steps to Reproduce
|
|
13
|
+
|
|
14
|
+
1. Call the method `...`
|
|
15
|
+
2. Pass the following options/parameters `...`
|
|
16
|
+
3. Execute the code
|
|
17
|
+
4. See the error
|
|
18
|
+
|
|
19
|
+
## Code Snippet / Logs
|
|
20
|
+
|
|
21
|
+
**JavaScript Code:**
|
|
22
|
+
|
|
23
|
+
```javascript
|
|
24
|
+
// Insert the JavaScript code that triggers the issue here
|
|
25
|
+
const result = await MyModel.find({ ... });
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Error Logs / Output
|
|
29
|
+
|
|
30
|
+
```txt
|
|
31
|
+
TypeError: ... is not a function
|
|
32
|
+
at ...
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Expected Behavior
|
|
36
|
+
|
|
37
|
+
Example: The `find()` method should return a native JavaScript Array of `ModelInstance` objects so that `.length` or indexation like `[0]` works out of the box when multiple rows are returned.
|
|
38
|
+
|
|
39
|
+
## Environment
|
|
40
|
+
|
|
41
|
+
- sql-connector version: vX.X.X
|
|
42
|
+
- Node.js version: vXX.XX.X
|
|
43
|
+
- Database (MySQL/MariaDB...): MySQL vX.X
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Feature request
|
|
3
|
+
about: Suggest an idea for this project
|
|
4
|
+
title: ''
|
|
5
|
+
labels: ''
|
|
6
|
+
assignees: lagie-marin
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Feature Type
|
|
11
|
+
- [ ] New method / API addition
|
|
12
|
+
- [ ] Performance improvement
|
|
13
|
+
- [ ] Architecture Refactoring (ORM / Data Mapping)
|
|
14
|
+
- [ ] Other:
|
|
15
|
+
|
|
16
|
+
## Problem Statement
|
|
17
|
+
*Example: Currently, the ORM wraps the raw driver payload `[rows, fields]` inside a single global `ModelInstance`. This forces developers to leak internal database structure by accessing nested arrays like `data[0][0]` when handling records, destroying proper encapsulation.*
|
|
18
|
+
|
|
19
|
+
## Proposed Solution
|
|
20
|
+
*Example: Refactor the `find()` method to map and split the query results. It should return a native Array where each row is mapped into its own independent `ModelInstance`. Implement dynamic data-mapping (via continuous references, Getters/Setters, or a Proxy) to allow direct property access (`job.status`) without cloning the memory footprint.*
|
|
21
|
+
|
|
22
|
+
## Desired Developer Experience (DX / Example)
|
|
23
|
+
```javascript
|
|
24
|
+
// Provide an example of how the ideal code should look after this feature:
|
|
25
|
+
const jobs = await InjectionJobs.find({ where: { status: "running" } });
|
|
26
|
+
|
|
27
|
+
console.log(jobs.length); // Native array length works
|
|
28
|
+
console.log(jobs[0].status); // Direct property access on the instance
|
|
29
|
+
await jobs[0].updateOne({ status: "success" }); // Instance methods remain fully bound
|
package/README.md
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
# sql-connector documentation
|
|
2
2
|
|
|
3
|
+
    
|
|
4
|
+

|
|
5
|
+
|
|
3
6
|
[Français](./docs/fr/README.md) | English
|
|
4
7
|
|
|
5
8
|
sql-connector helps manage MySQL connections, define table schemas, sync tables automatically, and work with database models through a small API.
|
|
@@ -32,41 +35,91 @@ await connect(config);
|
|
|
32
35
|
await logout();
|
|
33
36
|
```
|
|
34
37
|
|
|
38
|
+
### Example
|
|
39
|
+
|
|
40
|
+
```js
|
|
41
|
+
const { connect: dbConnect, client, Model } = require("@mlagie/sql-connector");
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
await dbConnect({
|
|
45
|
+
host: 'localhost',
|
|
46
|
+
port: 3306,
|
|
47
|
+
user: 'root',
|
|
48
|
+
password: 'password',
|
|
49
|
+
database: 'mydatabase',
|
|
50
|
+
connectionLimit: 2,
|
|
51
|
+
multipleStatements: true,
|
|
52
|
+
idleTimeout: 10000,
|
|
53
|
+
typeCast: true,
|
|
54
|
+
}).then(() => { Logger.client("- connected to the database") }).catch(error => {
|
|
55
|
+
console.error(error);
|
|
56
|
+
process.exit();
|
|
57
|
+
});
|
|
58
|
+
```
|
|
59
|
+
|
|
35
60
|
## Schema
|
|
36
61
|
|
|
37
62
|
`Schema` describes the structure of a table. Each field can use the following properties.
|
|
38
63
|
|
|
39
|
-
| Property
|
|
40
|
-
|
|
41
|
-
| type
|
|
42
|
-
| length
|
|
43
|
-
| required
|
|
44
|
-
| default
|
|
45
|
-
| unique
|
|
46
|
-
| auto_increment | `boolean`
|
|
47
|
-
| foreignKey
|
|
48
|
-
| enum
|
|
49
|
-
| primary_key
|
|
50
|
-
| customize
|
|
64
|
+
| Property | Type | Description |
|
|
65
|
+
|----------------|----------------------------------|------------------------|
|
|
66
|
+
| type | `SqlType` or `{ name: SqlType }` | SQL type for the field |
|
|
67
|
+
| length | `number` | Maximum length |
|
|
68
|
+
| required | `boolean` | Not null constraint |
|
|
69
|
+
| default | `any` | Default value |
|
|
70
|
+
| unique | `boolean` | Unique constraint |
|
|
71
|
+
| auto_increment | `boolean` | Auto increment |
|
|
72
|
+
| foreignKey | `string` | Foreign key reference |
|
|
73
|
+
| enum | `string[]` | Allowed values |
|
|
74
|
+
| primary_key | `boolean` | Primary key flag |
|
|
75
|
+
| customize | `string` | Extra SQL options |
|
|
76
|
+
|
|
77
|
+
### Example Schema creation & Model Creation
|
|
51
78
|
|
|
52
79
|
```javascript
|
|
80
|
+
const { Schema, Model, sqlTypeMap } = require("@mlagie/sql-connector");
|
|
81
|
+
|
|
53
82
|
const userSchema = new Schema({
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
83
|
+
id: {
|
|
84
|
+
type: Number,
|
|
85
|
+
auto_increment: true,
|
|
86
|
+
primary_key: true
|
|
87
|
+
},
|
|
88
|
+
group_uuid: {
|
|
89
|
+
type: String,
|
|
90
|
+
required: true,
|
|
91
|
+
primary_key: true,
|
|
92
|
+
length: 36
|
|
93
|
+
},
|
|
94
|
+
email: {
|
|
95
|
+
type: String,
|
|
96
|
+
length: 255,
|
|
97
|
+
unique: true,
|
|
98
|
+
required: true
|
|
99
|
+
},
|
|
100
|
+
status: {
|
|
101
|
+
type: String,
|
|
102
|
+
enum: ['active', 'inactive', 'pending'],
|
|
103
|
+
default: 'pending'
|
|
104
|
+
},
|
|
105
|
+
uuid: {
|
|
106
|
+
type: String,
|
|
107
|
+
required: true,
|
|
108
|
+
primary_key: true,
|
|
109
|
+
length: 36
|
|
110
|
+
},
|
|
111
|
+
my_uuid: {
|
|
112
|
+
type: String,
|
|
113
|
+
required: true,
|
|
114
|
+
length: 36
|
|
115
|
+
},
|
|
116
|
+
created_at: {
|
|
117
|
+
type: Date,
|
|
118
|
+
default: sqlTypeMap.CurrentTimestamp
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
module.exports = new Model("User", userSchema);
|
|
122
|
+
|
|
70
123
|
});
|
|
71
124
|
```
|
|
72
125
|
|
|
@@ -92,25 +145,188 @@ Important: do not set both `primary_key: true` and `unique: true` on the same fi
|
|
|
92
145
|
|
|
93
146
|
Main methods:
|
|
94
147
|
|
|
95
|
-
- `save(data)`
|
|
96
|
-
- `
|
|
97
|
-
- `
|
|
98
|
-
- `
|
|
99
|
-
- `
|
|
100
|
-
- `
|
|
101
|
-
- `
|
|
102
|
-
- `dropTable()` drops the table
|
|
103
|
-
- `generate_uuid()` generates a unique UUID
|
|
104
|
-
- `Model.createAllTables()` creates tables in dependency order
|
|
148
|
+
- `save(data)` Inserts a row
|
|
149
|
+
- `find(options)` Retrieves entries from the table.
|
|
150
|
+
- `count(filter)` Counts rows
|
|
151
|
+
- `customRequest(custom)` Runs a custom SQL query
|
|
152
|
+
- `delete(filter)` Deletes a row
|
|
153
|
+
- `dropTable()` Drops the table
|
|
154
|
+
- `generate_uuid()` Generates a unique UUID
|
|
105
155
|
|
|
106
156
|
```javascript
|
|
107
157
|
const userModel = new Model('users', userSchema);
|
|
108
158
|
|
|
109
|
-
await Model.
|
|
159
|
+
await Model.syncAllTables();
|
|
110
160
|
await userModel.save({ email: 'user@example.com', status: 'active' });
|
|
111
161
|
|
|
112
|
-
const user = await userModel.
|
|
113
|
-
await
|
|
162
|
+
const user = await userModel.find({ where: { email: 'user@example.com' }});
|
|
163
|
+
await user[0].deleteOne();
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
## save function
|
|
167
|
+
|
|
168
|
+
Saves data to the database table.
|
|
169
|
+
|
|
170
|
+
- **Parameters** `data` *(Object)* - The data to insert into the table.
|
|
171
|
+
- **Returns** `Promise<Object>` - A promise that resolves with the result of the insertion.
|
|
172
|
+
- **Throws** `Error` - Throws an error if the insert fails.
|
|
173
|
+
|
|
174
|
+
```js
|
|
175
|
+
const User = require("user");
|
|
176
|
+
|
|
177
|
+
async function createUser(email, stat) {
|
|
178
|
+
if (!email || !stat) {
|
|
179
|
+
console.error("Email & stat is required");
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
await User.save({ email: email, status: stat });
|
|
183
|
+
|
|
184
|
+
}
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
## find function
|
|
188
|
+
|
|
189
|
+
Retrieves entries from the table.
|
|
190
|
+
|
|
191
|
+
- **Parameters** `options` *(Object)* - Query options
|
|
192
|
+
- **Parameters** `options.select` *(string[])* - Fields to be returned.
|
|
193
|
+
- **Parameters** `options.where` *(Object)* - Filters (key/value).
|
|
194
|
+
- **Parameters** `options.order` *(Array)* - Ex: [['points', 'DESC']]
|
|
195
|
+
- **Parameters** `options.limit` *(number)* - Limit of results.
|
|
196
|
+
- **Returns** `Promise<Array<ModelInstance>>`
|
|
197
|
+
|
|
198
|
+
### find Options
|
|
199
|
+
|
|
200
|
+
| Option | Type | Description | Example |
|
|
201
|
+
|------------|-----------------|----------------------------------------------------------|----------------------------------------------|
|
|
202
|
+
| `select` | Array | Fields or transformations to retrieve | `['date_day']` |
|
|
203
|
+
| `where` | Object / String | Filtering conditions | `{ project_id: 1 }` |
|
|
204
|
+
| `groupBy` | Array | Fields used to group results | `['period']` |
|
|
205
|
+
| `orderBy` | Array | Sorting rules | `[{ field: 'date_day', direction: 'DESC' }]` |
|
|
206
|
+
| `having` | String | HAVING clause for aggregated queries | `'SUM(total_runs) > 100'` |
|
|
207
|
+
| `limit` | Number | Limits the number of results | `100` |
|
|
208
|
+
|
|
209
|
+
## Example find
|
|
210
|
+
|
|
211
|
+
```js
|
|
212
|
+
const User = require("user");
|
|
213
|
+
|
|
214
|
+
User.find({
|
|
215
|
+
select: [
|
|
216
|
+
{ dateFormat: ['date_day', '%Y-%m'], as: 'period' },
|
|
217
|
+
{ sum: 'error' },
|
|
218
|
+
{ sum: 'reload' },
|
|
219
|
+
],
|
|
220
|
+
groupBy: ['period'],
|
|
221
|
+
orderBy: [{ field: 'period', direction: 'ASC' }],
|
|
222
|
+
limit: 10
|
|
223
|
+
});
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
```js
|
|
227
|
+
const User = require("user");
|
|
228
|
+
|
|
229
|
+
User.find({
|
|
230
|
+
select: [
|
|
231
|
+
"email"
|
|
232
|
+
],
|
|
233
|
+
where: {
|
|
234
|
+
id: 1
|
|
235
|
+
}
|
|
236
|
+
})
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
## count function
|
|
240
|
+
|
|
241
|
+
Counts the number of records matching the given filter.
|
|
242
|
+
|
|
243
|
+
- **Parameters** `filter` *(Object)* The filter criteria for the query. Should be an object where keys are column names and values are the values to filter by.
|
|
244
|
+
- **Returns** `Promise<ModelInstance|number>` - A promise that resolves to a `ModelInstance` if a record is found, or `0` if no records match the filter.
|
|
245
|
+
|
|
246
|
+
## Example count
|
|
247
|
+
|
|
248
|
+
```js
|
|
249
|
+
const User = require("user");
|
|
250
|
+
|
|
251
|
+
User.count({
|
|
252
|
+
id: id
|
|
253
|
+
})
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
## customRequest function
|
|
257
|
+
|
|
258
|
+
The customRequest function allows you to execute SQL queries that are not supported by sql-connector; this could be in queries where the keywords are not yet implemented.
|
|
259
|
+
|
|
260
|
+
- **Parameters** `custom` *(string)* The custom SQL_request query to execute.
|
|
261
|
+
- **Returns** `Promise<void>` A promise that resolves when the query is executed.
|
|
262
|
+
- **Throws** `Error` Throws an error if query execution fails.
|
|
263
|
+
|
|
264
|
+
## Example customRequest
|
|
265
|
+
|
|
266
|
+
```js
|
|
267
|
+
const User = require("user");
|
|
268
|
+
|
|
269
|
+
User.customRequest("SELECT id, email, status
|
|
270
|
+
FROM users
|
|
271
|
+
WHERE status IN ('active', 'pending')
|
|
272
|
+
AND email LIKE '%gmail.com';")
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
## delete function
|
|
276
|
+
|
|
277
|
+
Deletes an entry from the SQL table that matches the provided filter.
|
|
278
|
+
|
|
279
|
+
- **Parameters** `filter` *(Object)* An object representing the filter conditions for deletion.
|
|
280
|
+
- **Returns** `Promise<number>` A promise that resolves to 0 if no rows were deleted, * or to a ModelInstance representing the deleted row.
|
|
281
|
+
- **Throws** `Error` Throws an error if the SQL query fails.
|
|
282
|
+
|
|
283
|
+
## Example delete
|
|
284
|
+
|
|
285
|
+
```js
|
|
286
|
+
const User = require("user");
|
|
287
|
+
|
|
288
|
+
User.delete({
|
|
289
|
+
email: my@gmail.com
|
|
290
|
+
})
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
## dropTable function
|
|
294
|
+
|
|
295
|
+
Asynchronously drops a table if it exists in the database.
|
|
296
|
+
|
|
297
|
+
This function constructs a SQL_request query to drop a table with the name specified by the `this.name` property. It then executes the query using a promise-based approach.
|
|
298
|
+
If the query is successful, the result is logged to the console.
|
|
299
|
+
If an error occurs during the execution of the query, an error message is logged.
|
|
300
|
+
|
|
301
|
+
- **Returns** `Promise<void>` A promise that resolves when the query execution is complete.
|
|
302
|
+
|
|
303
|
+
## Example dropTable
|
|
304
|
+
|
|
305
|
+
```js
|
|
306
|
+
const User = require("user");
|
|
307
|
+
|
|
308
|
+
User.dropTable();
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
## generate_uuid function
|
|
312
|
+
|
|
313
|
+
Generates a unique UUID for the current model.
|
|
314
|
+
This function generates a UUID using the SQL_request `UUID()` function and checks if the generated UUID already exists in the database for the current model. If the UUID is unique, it is returned.
|
|
315
|
+
Otherwise, the function resolves to `null`.
|
|
316
|
+
|
|
317
|
+
- **Parameters** `string` var_uuid By default, it is set to uuid.
|
|
318
|
+
- **Returns** `Promise<string|null>` A promise that resolves to a unique UUID string if successful, or `null` if an error occurs or the UUID is not unique.
|
|
319
|
+
- **Throws** `Error` If there is an error executing the SQL_request query.
|
|
320
|
+
|
|
321
|
+
## Example generate_uuid
|
|
322
|
+
|
|
323
|
+
```js
|
|
324
|
+
const User = require("user");
|
|
325
|
+
|
|
326
|
+
const uuid = await User.generate_uuid();
|
|
327
|
+
const my_uuid = await User.generate_uuid("my_uuid");
|
|
328
|
+
|
|
329
|
+
await User.save{ email: "user@example.com", status: "active", uuid: uuid, my_uuid: my_uuid }
|
|
114
330
|
```
|
|
115
331
|
|
|
116
332
|
## Model instances
|
|
@@ -122,8 +338,8 @@ await userModel.delete({ email: 'user@example.com' });
|
|
|
122
338
|
- `deleteOne()` deletes the instance row
|
|
123
339
|
- `customRequest(custom)` runs a custom query
|
|
124
340
|
|
|
125
|
-
```
|
|
126
|
-
const userInstance =
|
|
341
|
+
```js
|
|
342
|
+
const userInstance = await find({ select: "users", where: { email: 'user@example.com' }})[0];
|
|
127
343
|
|
|
128
344
|
await userInstance.updateOne({ status: 'inactive' });
|
|
129
345
|
await userInstance.deleteOne();
|
|
@@ -155,4 +371,4 @@ module.exports = client => {
|
|
|
155
371
|
|
|
156
372
|
## Summary
|
|
157
373
|
|
|
158
|
-
sql-connector provides a small layer to connect to MySQL, describe schemas, synchronize tables, and manipulate data with typed models.
|
|
374
|
+
sql-connector provides a small layer to connect to MySQL, describe schemas, synchronize tables, and manipulate data with typed models.
|
package/docs/fr/README.md
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
# Documentation du module sql-connector
|
|
2
2
|
|
|
3
|
+
    
|
|
4
|
+

|
|
5
|
+
|
|
3
6
|
[English](../../README.md) | Français
|
|
4
7
|
|
|
5
8
|
Le module sql-connector permet de gérer des connexions MySQL, de définir des schémas, de synchroniser automatiquement des tables et d'exposer des modèles pour manipuler les données simplement.
|
|
@@ -36,18 +39,18 @@ await logout();
|
|
|
36
39
|
|
|
37
40
|
`Schema` décrit la structure d'une table. Chaque champ peut utiliser les propriétés suivantes.
|
|
38
41
|
|
|
39
|
-
| Propriété
|
|
40
|
-
|
|
41
|
-
| type
|
|
42
|
-
| length
|
|
43
|
-
| required
|
|
44
|
-
| default
|
|
45
|
-
| unique
|
|
46
|
-
| auto_increment | `boolean`
|
|
47
|
-
| foreignKey
|
|
48
|
-
| enum
|
|
49
|
-
| primary_key
|
|
50
|
-
| customize
|
|
42
|
+
| Propriété | Type | Description |
|
|
43
|
+
|----------------|----------------------------------|-----------------------------|
|
|
44
|
+
| type | `SqlType` ou `{ name: SqlType }` | Type SQL du champ |
|
|
45
|
+
| length | `number` | Longueur maximale |
|
|
46
|
+
| required | `boolean` | Champ obligatoire |
|
|
47
|
+
| default | `any` | Valeur par défaut |
|
|
48
|
+
| unique | `boolean` | Valeur unique |
|
|
49
|
+
| auto_increment | `boolean` | Auto-incrément |
|
|
50
|
+
| foreignKey | `string` | Référence de clé étrangère |
|
|
51
|
+
| enum | `string[]` | Liste de valeurs autorisées |
|
|
52
|
+
| primary_key | `boolean` | Clé primaire |
|
|
53
|
+
| customize | `string` | Options SQL additionnelles |
|
|
51
54
|
|
|
52
55
|
```javascript
|
|
53
56
|
const userSchema = new Schema({
|
|
@@ -66,7 +69,22 @@ const userSchema = new Schema({
|
|
|
66
69
|
type: String,
|
|
67
70
|
enum: ['active', 'inactive', 'pending'],
|
|
68
71
|
default: 'pending'
|
|
69
|
-
}
|
|
72
|
+
},
|
|
73
|
+
uuid: {
|
|
74
|
+
type: String,
|
|
75
|
+
required: true,
|
|
76
|
+
primary_key: true,
|
|
77
|
+
length: 36
|
|
78
|
+
},
|
|
79
|
+
my_uuid: {
|
|
80
|
+
type: String,
|
|
81
|
+
required: true,
|
|
82
|
+
length: 36
|
|
83
|
+
},
|
|
84
|
+
created_at: {
|
|
85
|
+
type: Date,
|
|
86
|
+
default: sqlTypeMap.CurrentTimestamp
|
|
87
|
+
}
|
|
70
88
|
});
|
|
71
89
|
```
|
|
72
90
|
|
|
@@ -93,24 +111,190 @@ Point important: ne combinez pas `primary_key: true` et `unique: true` sur le m
|
|
|
93
111
|
Méthodes principales:
|
|
94
112
|
|
|
95
113
|
- `save(data)` pour insérer une ligne
|
|
96
|
-
- `findOne(filter, fields)` pour récupérer une seule entrée
|
|
97
114
|
- `find(filter, fields)` pour récupérer plusieurs entrées
|
|
98
|
-
- `findAll(options)` pour les recherches avancées
|
|
99
115
|
- `count(filter)` pour compter les lignes
|
|
100
116
|
- `customRequest(custom)` pour exécuter une requête SQL personnalisée
|
|
101
117
|
- `delete(filter)` pour supprimer une entrée
|
|
102
118
|
- `dropTable()` pour supprimer la table
|
|
103
119
|
- `generate_uuid()` pour générer un UUID unique
|
|
104
|
-
- `Model.createAllTables()` pour créer toutes les tables dans le bon ordre
|
|
105
120
|
|
|
106
121
|
```javascript
|
|
107
122
|
const userModel = new Model('users', userSchema);
|
|
108
123
|
|
|
109
|
-
await Model.
|
|
124
|
+
await Model.syncAllTables();
|
|
110
125
|
await userModel.save({ email: 'user@example.com', status: 'active' });
|
|
111
126
|
|
|
112
|
-
const user = await userModel.
|
|
113
|
-
await
|
|
127
|
+
const user = await userModel.find({ where: { email: 'user@example.com' }});
|
|
128
|
+
await user[0].deleteOne();
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## Fonction save
|
|
132
|
+
|
|
133
|
+
Enregistre les données dans la table de la base de données.
|
|
134
|
+
|
|
135
|
+
- **Parameters** `data` *(Object)* - Les données à insérer dans la table.
|
|
136
|
+
- **Returns** `Promise<Object>` - Une promesse avec le résultat de l'insertion.
|
|
137
|
+
- **Throws** `Error` - Lève une erreur si l'insertion échoue.
|
|
138
|
+
|
|
139
|
+
```js
|
|
140
|
+
const User = require("user");
|
|
141
|
+
|
|
142
|
+
async function createUser(email, stat) {
|
|
143
|
+
if (!email || !stat) {
|
|
144
|
+
console.error("Email & stat is required");
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
await User.save({ email: email, status: stat });
|
|
148
|
+
|
|
149
|
+
}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## Fonction find
|
|
153
|
+
|
|
154
|
+
Récupère des entrées de la table.
|
|
155
|
+
|
|
156
|
+
- **Parameters** `options` *(Object)* - Options de requête
|
|
157
|
+
- **Parameters** `options.select` *(string[])* - Champs à renvoyer.
|
|
158
|
+
- **Parameters** `options.where` *(Object)* - Filtre (key/value).
|
|
159
|
+
- **Parameters** `options.order` *(Array)* - Ex: [['points', 'DESC']]
|
|
160
|
+
- **Parameters** `options.limit` *(number)* - Limite de résultats.
|
|
161
|
+
- **Returns** `Promise<Array<ModelInstance>>`
|
|
162
|
+
|
|
163
|
+
### Options de find
|
|
164
|
+
|
|
165
|
+
| Option | Type | Description | Example |
|
|
166
|
+
|------------|-----------------|----------------------------------------------------------|----------------------------------------------|
|
|
167
|
+
| `select` | Array | Champs ou transformations à récupérer | `['date_day']` |
|
|
168
|
+
| `where` | Object / String | Conditions de filtrage | `{ project_id: 1 }` |
|
|
169
|
+
| `groupBy` | Array | Champs utilisés pour regrouper les résultats | `['period']` |
|
|
170
|
+
| `orderBy` | Array | Règles de tri | `[{ field: 'date_day', direction: 'DESC' }]` |
|
|
171
|
+
| `having` | String | Clause HAVING pour les requêtes agrégées | `'SUM(total_runs) > 100'` |
|
|
172
|
+
| `limit` | Number | Limite le nombre de résultats | `100` |
|
|
173
|
+
|
|
174
|
+
## Exemple find
|
|
175
|
+
|
|
176
|
+
```js
|
|
177
|
+
const User = require("user");
|
|
178
|
+
|
|
179
|
+
await User.find({
|
|
180
|
+
select: [
|
|
181
|
+
{ dateFormat: ['date_day', '%Y-%m'], as: 'period' },
|
|
182
|
+
{ sum: 'error' },
|
|
183
|
+
{ sum: 'reload' },
|
|
184
|
+
],
|
|
185
|
+
groupBy: ['period'],
|
|
186
|
+
orderBy: [{ field: 'period', direction: 'ASC' }],
|
|
187
|
+
limit: 10
|
|
188
|
+
});
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
```js
|
|
192
|
+
const User = require("user");
|
|
193
|
+
|
|
194
|
+
await User.find({
|
|
195
|
+
select: [
|
|
196
|
+
"email"
|
|
197
|
+
],
|
|
198
|
+
where: {
|
|
199
|
+
id: 1
|
|
200
|
+
}
|
|
201
|
+
})
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
## Fonction count
|
|
205
|
+
|
|
206
|
+
Compte le nombre d'enregistrements correspondant au filtre donné.
|
|
207
|
+
|
|
208
|
+
- **Parameters** `filter` *(Object)* Les critères de filtrage de la requête. Il doit s'agir d'un objet dont les clés sont les noms des colonnes et les valeurs sont les valeurs de filtrage.
|
|
209
|
+
- **Returns** `Promise<ModelInstance|number>` - Une promesse qui se résout en une instance `ModelInstance` si un enregistrement est trouvé, ou en `0` si aucun enregistrement ne correspond au filtre.
|
|
210
|
+
|
|
211
|
+
## Exemple count
|
|
212
|
+
|
|
213
|
+
```js
|
|
214
|
+
const User = require("user");
|
|
215
|
+
|
|
216
|
+
await User.count({
|
|
217
|
+
id: id
|
|
218
|
+
})
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
## Fonction customRequest
|
|
222
|
+
|
|
223
|
+
La fonction customRequest vous permet d'exécuter des requêtes SQL non prises en charge par sql-connector ; cela peut concerner des requêtes utilisant des mots-clés qui ne sont pas encore implémentés.
|
|
224
|
+
|
|
225
|
+
- **Parameters** `custom` *(string)* La requête SQL personnalisée à exécuter.
|
|
226
|
+
- **Returns** `Promise<void>` Valeur retournée
|
|
227
|
+
- **Throws** `Error` Lève une erreur si l'exécution de la requête échoue.
|
|
228
|
+
|
|
229
|
+
## Exemple customRequest
|
|
230
|
+
|
|
231
|
+
```js
|
|
232
|
+
const User = require("user");
|
|
233
|
+
|
|
234
|
+
await User.customRequest("SELECT id, email, status
|
|
235
|
+
FROM users
|
|
236
|
+
WHERE status IN ('active', 'pending')
|
|
237
|
+
AND email LIKE '%gmail.com';")
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
## Fonction delete
|
|
241
|
+
|
|
242
|
+
Supprime de la table SQL une entrée correspondant au filtre fourni.
|
|
243
|
+
|
|
244
|
+
- **Parameters** `filter` *(Object)* Un objet représentant les conditions de filtrage pour la suppression.
|
|
245
|
+
- **Returns** `Promise<number>` Une promesse qui se résout à 0 si aucune ligne n'a été supprimée, ou à une instance de modèle représentant la ligne supprimée.
|
|
246
|
+
- **Throws** `Error` Une promesse qui se résout à 0 si aucune ligne n'a été supprimée, ou à une instance de modèle représentant la ligne supprimée.
|
|
247
|
+
|
|
248
|
+
## Exemple delete
|
|
249
|
+
|
|
250
|
+
```js
|
|
251
|
+
const User = require("user");
|
|
252
|
+
|
|
253
|
+
await User.delete({
|
|
254
|
+
email: my@gmail.com
|
|
255
|
+
})
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
## Fonction dropTable
|
|
259
|
+
|
|
260
|
+
Supprime de manière asynchrone une table si elle existe dans la base de données.
|
|
261
|
+
|
|
262
|
+
Cette fonction construit une requête SQL pour supprimer la table dont le nom est spécifié par la propriété `this.name`. Elle exécute ensuite la requête en utilisant une approche basée sur les promesses.
|
|
263
|
+
Si la requête aboutit, le résultat est consigné dans la console.
|
|
264
|
+
|
|
265
|
+
En cas d'erreur lors de l'exécution de la requête, un message d'erreur est consigné.
|
|
266
|
+
|
|
267
|
+
- **Returns** `Promise<void>` Une promesse qui se résout une fois l'exécution de la requête terminée.
|
|
268
|
+
|
|
269
|
+
## Example dropTable
|
|
270
|
+
|
|
271
|
+
```js
|
|
272
|
+
const User = require("user");
|
|
273
|
+
|
|
274
|
+
await User.dropTable();
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
## generate_uuid function
|
|
278
|
+
|
|
279
|
+
Génère un UUID unique pour le modèle actuel.
|
|
280
|
+
|
|
281
|
+
Cette fonction génère un UUID à l'aide de la fonction `UUID()` de SQL_request et vérifie si cet UUID existe déjà dans la base de données pour le modèle actuel. Si l'UUID est unique, il est renvoyé.
|
|
282
|
+
|
|
283
|
+
Sinon, la fonction renvoie `null`.
|
|
284
|
+
|
|
285
|
+
- **Parameters** `string` var_uuid Par defaut il vaut uuid
|
|
286
|
+
- **Returns** `Promise<string|null>` Une promesse qui se résout en une chaîne UUID unique en cas de succès, ou en `null` si une erreur survient ou si l'UUID n'est pas unique.
|
|
287
|
+
- **Throws** `Error` S'il y a une erreur lors de l'exécution de la requête SQL_request.
|
|
288
|
+
|
|
289
|
+
## Example generate_uuid
|
|
290
|
+
|
|
291
|
+
```js
|
|
292
|
+
const User = require("user");
|
|
293
|
+
|
|
294
|
+
const uuid = await User.generate_uuid();
|
|
295
|
+
const my_uuid = await User.generate_uuid("my_uuid");
|
|
296
|
+
|
|
297
|
+
await User.save{ email: "user@example.com", status: "active", uuid: uuid, my_uuid: my_uuid }
|
|
114
298
|
```
|
|
115
299
|
|
|
116
300
|
## Instances de modèle
|
|
@@ -155,4 +339,4 @@ module.exports = client => {
|
|
|
155
339
|
|
|
156
340
|
## Résumé
|
|
157
341
|
|
|
158
|
-
sql-connector fournit une couche simple pour connecter une base MySQL, décrire des schémas, synchroniser les tables et manipuler les données avec des modèles typés.
|
|
342
|
+
sql-connector fournit une couche simple pour connecter une base MySQL, décrire des schémas, synchroniser les tables et manipuler les données avec des modèles typés.
|