Skip to content

Commit abb4804

Browse files
committed
feat: support insert multi rows
1 parent cad4612 commit abb4804

File tree

4 files changed

+201
-17
lines changed

4 files changed

+201
-17
lines changed

README.md

Lines changed: 63 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -52,20 +52,60 @@ var db = rds({
5252
});
5353
```
5454

55-
### Queries
55+
### Insert
5656

57-
- Query with arguments
57+
- Insert one row
5858

5959
```js
60-
var rows = yield db.query('SELECT * FROM your_table LIMIT 100');
61-
console.log(rows);
60+
var row = {
61+
name: 'fengmk2',
62+
otherField: 'other field value',
63+
createdAt: db.literals.now, // `now()` on db server
64+
// ...
65+
};
66+
var result = yield db.insert('table-name', row);
67+
console.log(result);
68+
{ fieldCount: 0,
69+
affectedRows: 1,
70+
insertId: 3710,
71+
serverStatus: 2,
72+
warningCount: 2,
73+
message: '',
74+
protocol41: true,
75+
changedRows: 0 }
6276
```
6377

64-
- Query with arguments
78+
- Insert multi rows
79+
80+
Will execute under a transaction and auto commit.
6581

6682
```js
67-
var rows = yield db.query('SELECT * FROM your_table WHERE id=?', [123]);
68-
console.log(rows);
83+
var rows = [
84+
{
85+
name: 'fengmk1',
86+
otherField: 'other field value',
87+
createdAt: db.literals.now, // `now()` on db server
88+
// ...
89+
},
90+
{
91+
name: 'fengmk2',
92+
otherField: 'other field value',
93+
createdAt: db.literals.now, // `now()` on db server
94+
// ...
95+
},
96+
// ...
97+
];
98+
99+
var results = yield db.insert('table-name', rows);
100+
console.log(result);
101+
{ fieldCount: 0,
102+
affectedRows: 2,
103+
insertId: 3840,
104+
serverStatus: 2,
105+
warningCount: 2,
106+
message: '&Records: 2 Duplicates: 0 Warnings: 0',
107+
protocol41: true,
108+
changedRows: 0 }
69109
```
70110

71111
### Transactions
@@ -101,6 +141,22 @@ try {
101141
}
102142
```
103143

144+
### Raw Queries
145+
146+
- Query with arguments
147+
148+
```js
149+
var rows = yield db.query('SELECT * FROM your_table LIMIT 100');
150+
console.log(rows);
151+
```
152+
153+
- Query with arguments
154+
155+
```js
156+
var rows = yield db.query('SELECT * FROM your_table WHERE id=?', [123]);
157+
console.log(rows);
158+
```
159+
104160
## SQL Server Usage
105161

106162
TBD

lib/connection.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,18 @@ proto._query = function (sql) {
4343
proto.beginTransaction = function () {
4444
var conn = this.conn;
4545
return function (callback) {
46-
conn.beginTransaction(callback);
46+
conn.beginTransaction(function (err, result) {
47+
callback(err, result);
48+
});
4749
};
4850
};
4951

5052
proto.commit = function () {
5153
var conn = this.conn;
5254
return function (callback) {
53-
conn.commit(callback);
55+
conn.commit(function (err, result) {
56+
callback(err, result);
57+
});
5458
};
5559
};
5660

lib/operator.js

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ proto.select = function* (table, options) {
7070
this._where(options.where) +
7171
this._orders(options.orders) +
7272
this._limit(options.limit, options.offset);
73-
debug('list(%j, %j) \n=> %j', table, options, sql);
73+
debug('select(%j, %j) \n=> %j', table, options, sql);
7474
return yield this.query(sql);
7575
};
7676

@@ -83,17 +83,35 @@ proto.get = function* (table, where, options) {
8383
return rows && rows[0] || null;
8484
};
8585

86-
proto.insert = function* (table, obj, options) {
86+
proto.insert = function* (table, rows, options) {
8787
options = options || {};
88+
var firstObj;
89+
// insert(table, rows)
90+
if (Array.isArray(rows)) {
91+
firstObj = rows[0];
92+
} else {
93+
// insert(table, row)
94+
firstObj = rows;
95+
rows = [rows];
96+
}
8897
if (!options.columns) {
89-
options.columns = Object.keys(obj);
98+
options.columns = Object.keys(firstObj);
9099
}
91-
var values = [];
92-
for (var i = 0; i < options.columns.length; i++) {
93-
values.push(obj[options.columns[i]]);
100+
101+
var params = [table, options.columns];
102+
var strs = [];
103+
for (var i = 0; i < rows.length; i++) {
104+
var values = [];
105+
var row = rows[i];
106+
for (var j = 0; j < options.columns.length; j++) {
107+
values.push(row[options.columns[j]]);
108+
}
109+
strs.push('(?)');
110+
params.push(values);
94111
}
95-
var sql = this.format('INSERT INTO ??(??) VALUES(?);', [table, options.columns, values]);
96-
debug('insert(%j, %j, %j) \n=> %j', table, obj, options, sql);
112+
113+
var sql = this.format('INSERT INTO ??(??) VALUES' + strs.join(', '), params);
114+
debug('insert(%j, %j, %j) \n=> %j', table, rows, options, sql);
97115
return yield this.query(sql);
98116
};
99117

test/client.test.js

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ var config = require('./config');
2020

2121
describe('client.test.js', function () {
2222
var prefix = 'prefix-' + process.version + '-';
23+
var table = 'ali-sdk-test-user';
2324
before(function* () {
2425
this.db = rds(config);
2526
yield this.db.query('delete from `ali-sdk-test-user` where name like ?', [prefix + '%']);
@@ -264,6 +265,111 @@ describe('client.test.js', function () {
264265
});
265266
});
266267

268+
describe('insert(table, row[s])', function () {
269+
it('should insert one row', function* () {
270+
var result = yield this.db.insert(table, {
271+
name: prefix + 'fengmk2-insert1',
272+
email: prefix + 'm@fengmk2-insert.com'
273+
});
274+
assert.equal(result.affectedRows, 1);
275+
});
276+
277+
it('should insert multi rows', function* () {
278+
var result = yield this.db.insert(table, [
279+
{
280+
name: prefix + 'fengmk2-insert2',
281+
email: prefix + 'm@fengmk2-insert.com'
282+
},
283+
{
284+
name: prefix + 'fengmk2-insert3',
285+
email: prefix + 'm@fengmk2-insert.com'
286+
},
287+
]);
288+
assert.equal(result.affectedRows, 2);
289+
var row = yield this.db.get(table, {id: result.insertId});
290+
assert(row);
291+
assert.equal(row.id, result.insertId);
292+
});
293+
294+
it('should insert multi fail', function* () {
295+
try {
296+
yield this.db.insert(table, [
297+
{
298+
name: prefix + 'fengmk2-insert4',
299+
email: prefix + 'm@fengmk2-insert.com'
300+
},
301+
{
302+
name: prefix + 'fengmk2-insert4',
303+
email: prefix + 'm@fengmk2-insert.com'
304+
},
305+
]);
306+
throw new Error('should not run this');
307+
} catch (err) {
308+
assert.equal(err.code, 'ER_DUP_ENTRY');
309+
}
310+
var row = yield this.db.get(table, {name: prefix + 'fengmk2-insert4'});
311+
assert(!row);
312+
});
313+
314+
it('should part success on Duplicate key without transaction', function* () {
315+
var result = yield this.db.insert(table, {
316+
name: prefix + 'fengmk2-insert-no-tran',
317+
email: prefix + 'm@fengmk2-insert.com'
318+
});
319+
assert.equal(result.affectedRows, 1);
320+
var rows = yield this.db.select(table, {
321+
where: {name: prefix + 'fengmk2-insert-no-tran'}
322+
});
323+
assert.equal(rows.length, 1);
324+
325+
try {
326+
yield this.db.insert(table, {
327+
name: prefix + 'fengmk2-insert-no-tran',
328+
email: prefix + 'm@fengmk2-insert.com'
329+
});
330+
throw new Error('should not run this');
331+
} catch (err) {
332+
assert.equal(err.code, 'ER_DUP_ENTRY');
333+
}
334+
var rows = yield this.db.select(table, {
335+
where: {name: prefix + 'fengmk2-insert-no-tran'}
336+
});
337+
assert.equal(rows.length, 1);
338+
});
339+
340+
it('should all fail on Duplicate key with transaction', function* () {
341+
var tran = yield this.db.beginTransaction();
342+
try {
343+
var result = yield tran.insert(table, {
344+
name: prefix + 'fengmk2-insert-has-tran',
345+
email: prefix + 'm@fengmk2-insert.com'
346+
});
347+
assert.equal(result.affectedRows, 1);
348+
var rows = yield tran.select(table, {
349+
where: {name: prefix + 'fengmk2-insert-has-tran'}
350+
});
351+
assert.equal(rows.length, 1);
352+
353+
yield tran.insert(table, {
354+
name: prefix + 'fengmk2-insert-has-tran',
355+
email: prefix + 'm@fengmk2-insert.com'
356+
});
357+
358+
yield tran.commit();
359+
} catch (err) {
360+
yield tran.rollback();
361+
assert.equal(err.code, 'ER_DUP_ENTRY');
362+
} finally {
363+
tran.release();
364+
}
365+
366+
var rows = yield this.db.select(table, {
367+
where: {name: prefix + 'fengmk2-insert-has-tran'}
368+
});
369+
assert.equal(rows.length, 0);
370+
});
371+
});
372+
267373
describe('update(table, obj, options)', function () {
268374
before(function* () {
269375
yield this.db.insert('ali-sdk-test-user', {

0 commit comments

Comments
 (0)