neopg 2.2.2 → 2.2.4
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/README.cn.md +5 -1
- package/README.md +5 -1
- package/lib/ModelChain.js +29 -12
- package/lib/SchemaSync.js +12 -2
- package/lib/dataTypes.js +9 -0
- package/package.json +1 -1
- package/test/test-db.js +16 -1
package/README.cn.md
CHANGED
|
@@ -263,7 +263,10 @@ const users = await db.model('User')
|
|
|
263
263
|
const user = await db.model('User').where({ id: '123' }).get();
|
|
264
264
|
|
|
265
265
|
// 分页查询
|
|
266
|
-
const page2 = await db.model('User')
|
|
266
|
+
const page2 = await db.model('User')
|
|
267
|
+
.select(['id', 'username', 'level'])
|
|
268
|
+
.page(2, 20)
|
|
269
|
+
.find(); // 第 2 页,每页 20 条
|
|
267
270
|
```
|
|
268
271
|
|
|
269
272
|
### 链式 Where 条件
|
|
@@ -276,6 +279,7 @@ await db.model('User')
|
|
|
276
279
|
})
|
|
277
280
|
.where('create_time', '>', 1600000000)
|
|
278
281
|
.where('id IS NOT NULL')
|
|
282
|
+
.select(db.sql`id, username, role`)
|
|
279
283
|
.find()
|
|
280
284
|
```
|
|
281
285
|
|
package/README.md
CHANGED
|
@@ -261,7 +261,10 @@ const users = await db.model('User')
|
|
|
261
261
|
const user = await db.model('User').where({ id: '123' }).get();
|
|
262
262
|
|
|
263
263
|
// Pagination
|
|
264
|
-
const page2 = await db.model('User')
|
|
264
|
+
const page2 = await db.model('User')
|
|
265
|
+
.select(['id', 'username', 'role'])
|
|
266
|
+
.page(2, 20)
|
|
267
|
+
.find(); // Page 2, Size 20
|
|
265
268
|
```
|
|
266
269
|
|
|
267
270
|
### Chained Where
|
|
@@ -274,6 +277,7 @@ await db.model('User')
|
|
|
274
277
|
})
|
|
275
278
|
.where('create_time', '>', 1600000000)
|
|
276
279
|
.where('id IS NOT NULL')
|
|
280
|
+
.select(db.sql`id, username, role`)
|
|
277
281
|
.find()
|
|
278
282
|
```
|
|
279
283
|
|
package/lib/ModelChain.js
CHANGED
|
@@ -90,11 +90,19 @@ class ModelChain {
|
|
|
90
90
|
|
|
91
91
|
select(columns) {
|
|
92
92
|
if (!columns) return this
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
93
|
+
|
|
94
|
+
// 1. 判断是否为 postgres.js 的原生 SQL 片段 (Tag Function 返回的对象)
|
|
95
|
+
// 如果不是数组且具备 Query 构造器特征,认为是开发者手写的 sql`...` 片段
|
|
96
|
+
if (!Array.isArray(columns) && typeof columns === 'object' && columns.constructor?.name === 'Query') {
|
|
97
|
+
this._columns = columns
|
|
98
|
+
}
|
|
99
|
+
else if (typeof columns === 'string') {
|
|
100
|
+
this._columns = columns.split(',').map(s => s.trim()).filter(Boolean)
|
|
97
101
|
}
|
|
102
|
+
else if (Array.isArray(columns)) {
|
|
103
|
+
this._columns = columns
|
|
104
|
+
}
|
|
105
|
+
|
|
98
106
|
return this
|
|
99
107
|
}
|
|
100
108
|
|
|
@@ -163,11 +171,10 @@ class ModelChain {
|
|
|
163
171
|
}
|
|
164
172
|
if (typeof arg === 'string') {
|
|
165
173
|
if (arg.includes(',')) {
|
|
166
|
-
arg.split(',').map(s => s.trim()).filter(
|
|
167
|
-
|
|
168
|
-
})
|
|
174
|
+
const parts = arg.split(',').map(s => s.trim()).filter(Boolean)
|
|
175
|
+
this._group.push(...parts)
|
|
169
176
|
} else {
|
|
170
|
-
this._group.push(
|
|
177
|
+
this._group.push(arg)
|
|
171
178
|
}
|
|
172
179
|
}
|
|
173
180
|
return this
|
|
@@ -268,14 +275,24 @@ class ModelChain {
|
|
|
268
275
|
|
|
269
276
|
_buildGroup() {
|
|
270
277
|
if (this._group.length === 0) return this.sql``
|
|
271
|
-
return this.sql`GROUP BY ${this._group}`
|
|
278
|
+
return this.sql`GROUP BY ${this.sql(this._group)}`
|
|
272
279
|
}
|
|
273
280
|
|
|
274
281
|
_buildSelectQuery() {
|
|
275
282
|
const t = this.sql(this.def.tableName)
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
283
|
+
let c
|
|
284
|
+
if (Array.isArray(this._columns)) {
|
|
285
|
+
if ((this._columns.length === 1 && this._columns[0] === '*') || this._columns.length === 0) {
|
|
286
|
+
c = this.sql`*`
|
|
287
|
+
} else {
|
|
288
|
+
c = this.sql(this._columns)
|
|
289
|
+
}
|
|
290
|
+
} else if (this._columns) {
|
|
291
|
+
// 如果是 sql`...` 片段,直接使用,不加任何额外处理
|
|
292
|
+
c = this._columns
|
|
293
|
+
} else {
|
|
294
|
+
c = this.sql`*`
|
|
295
|
+
}
|
|
279
296
|
|
|
280
297
|
const w = this._buildWhere()
|
|
281
298
|
const o = this._buildOrder()
|
package/lib/SchemaSync.js
CHANGED
|
@@ -311,7 +311,17 @@ class SchemaSync {
|
|
|
311
311
|
`;
|
|
312
312
|
|
|
313
313
|
if (exist.length > 0) continue;
|
|
314
|
-
|
|
314
|
+
let using_text = '';
|
|
315
|
+
if (typeof indname === 'string' && def.columns[indname]) {
|
|
316
|
+
if (!def.columns[indname].indexType) {
|
|
317
|
+
if (def.columns[indname].type.toLowerCase() === 'jsonb' || def.columns[indname].type.includes('[')) {
|
|
318
|
+
using_text = `USING GIN`;
|
|
319
|
+
}
|
|
320
|
+
} else {
|
|
321
|
+
using_text = `USING ${def.columns[indname].indexType}`;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
await sql.unsafe(`CREATE INDEX ${targetIdxName} ON ${curTableName} ${using_text} (${idxCols.map(c=>this.fmtColName(c)).join(',')})`);
|
|
315
325
|
}
|
|
316
326
|
}
|
|
317
327
|
|
|
@@ -352,7 +362,7 @@ class SchemaSync {
|
|
|
352
362
|
|
|
353
363
|
if (exist.length > 0) continue;
|
|
354
364
|
|
|
355
|
-
await sql.unsafe(`CREATE UNIQUE INDEX ON ${curTableName} (${idxCols.map(c=>this.fmtColName(c)).join(',')})`);
|
|
365
|
+
await sql.unsafe(`CREATE UNIQUE INDEX ${targetIdxName} ON ${curTableName} (${idxCols.map(c=>this.fmtColName(c)).join(',')})`);
|
|
356
366
|
}
|
|
357
367
|
}
|
|
358
368
|
|
package/lib/dataTypes.js
CHANGED
|
@@ -45,6 +45,15 @@ let types = {
|
|
|
45
45
|
SERIAL: 'serial',
|
|
46
46
|
BIGSERIAL: 'bigserial',
|
|
47
47
|
BigSerial: 'bigserial',
|
|
48
|
+
|
|
49
|
+
//几何类型
|
|
50
|
+
POINT: 'point',
|
|
51
|
+
LINE: 'LINE',
|
|
52
|
+
LSEG: 'lseg',
|
|
53
|
+
BOX: 'box',
|
|
54
|
+
PATH: 'path',
|
|
55
|
+
POLYGON: 'polygon',
|
|
56
|
+
CIRCLE: 'circle'
|
|
48
57
|
}
|
|
49
58
|
|
|
50
59
|
types.DECIMAL = types.NUMBER
|
package/package.json
CHANGED
package/test/test-db.js
CHANGED
|
@@ -122,6 +122,14 @@ const User = {
|
|
|
122
122
|
is_root: {
|
|
123
123
|
type: dataTypes.SMALLINT,
|
|
124
124
|
default: 0
|
|
125
|
+
},
|
|
126
|
+
skills: {
|
|
127
|
+
type: dataTypes.ARRAY(dataTypes.STRING(30))
|
|
128
|
+
},
|
|
129
|
+
points: {
|
|
130
|
+
type: dataTypes.POINT,
|
|
131
|
+
default: '(0,0)',
|
|
132
|
+
indexType: 'GiST'
|
|
125
133
|
}
|
|
126
134
|
},
|
|
127
135
|
|
|
@@ -130,7 +138,9 @@ const User = {
|
|
|
130
138
|
'create_time',
|
|
131
139
|
'level',
|
|
132
140
|
'is_root',
|
|
133
|
-
['level', 'is_root']
|
|
141
|
+
['level', 'is_root'],
|
|
142
|
+
'skills',
|
|
143
|
+
'points'
|
|
134
144
|
],
|
|
135
145
|
|
|
136
146
|
//唯一索引
|
|
@@ -278,6 +288,11 @@ db.add(User)
|
|
|
278
288
|
'test select * count',
|
|
279
289
|
await tx.model('User').select('*').findAndCount()
|
|
280
290
|
)
|
|
291
|
+
|
|
292
|
+
console.log(
|
|
293
|
+
'test select group',
|
|
294
|
+
await tx.model('User').group('level').select(tx.sql`level, MAX(username) as username`).findAndCount()
|
|
295
|
+
)
|
|
281
296
|
|
|
282
297
|
console.log(
|
|
283
298
|
'test avg',
|