質問編集履歴
10
修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -10,7 +10,9 @@
|
|
10
10
|
|
11
11
|
'(?,?),'(?,?)','(?,?)'に対応するにはどうすればいいのでしょうか?
|
12
12
|
|
13
|
+
|
14
|
+
|
13
|
-
|
15
|
+
**例**
|
14
16
|
|
15
17
|
```javascript
|
16
18
|
|
@@ -49,6 +51,8 @@
|
|
49
51
|
```
|
50
52
|
|
51
53
|
|
54
|
+
|
55
|
+
**上の例をみて複数に対応してみようとしたもの**
|
52
56
|
|
53
57
|
```javascript
|
54
58
|
|
9
修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -6,172 +6,90 @@
|
|
6
6
|
|
7
7
|
**疑問点**
|
8
8
|
|
9
|
-
- INSERT INTO lorem VALUES (1, 'b1'), (2, 'b2'), (2, 'b3')のような複数レコードを一括で挿入したいとき、
|
9
|
+
- INSERT INTO lorem VALUES (1, 'b1'), (2, 'b2'), (2, 'b3')のような複数レコードを一括で挿入したいとき、上の例では、'(?),'(?)','(?)'ですが、
|
10
|
+
|
11
|
+
'(?,?),'(?,?)','(?,?)'に対応するにはどうすればいいのでしょうか?
|
10
12
|
|
11
13
|
|
12
14
|
|
15
|
+
```javascript
|
16
|
+
|
17
|
+
let languages = ['C++', 'Python', 'Java', 'C#', 'Go'];
|
18
|
+
|
19
|
+
|
20
|
+
|
21
|
+
// construct the insert statement with multiple placeholders
|
22
|
+
|
23
|
+
// based on the number of rows
|
24
|
+
|
25
|
+
let placeholders = languages.map((language) => '(?)').join(',');
|
26
|
+
|
27
|
+
let sql = 'INSERT INTO langs(name) VALUES ' + placeholders;
|
13
28
|
|
14
29
|
|
15
30
|
|
31
|
+
db.run(sql, languages, function(err) {
|
16
32
|
|
17
|
-
|
33
|
+
if (err) {
|
18
34
|
|
19
|
-
cons
|
35
|
+
return console.error(err.message);
|
20
36
|
|
37
|
+
}
|
38
|
+
|
39
|
+
console.log(`Rows inserted ${this.changes}`);
|
40
|
+
|
41
|
+
});
|
42
|
+
|
43
|
+
|
44
|
+
|
45
|
+
// close the database connection
|
46
|
+
|
21
|
-
|
47
|
+
db.close();
|
48
|
+
|
49
|
+
```
|
22
50
|
|
23
51
|
|
24
52
|
|
25
|
-
|
53
|
+
```javascript
|
26
54
|
|
55
|
+
let languages = [[0, 'C++'], [1, 'Python'], [2, 'Java'], [3, 'C#'], [4, 'Go']];
|
27
56
|
|
57
|
+
ht = "(";
|
28
58
|
|
29
|
-
|
59
|
+
for (let i = 0, end = languages [0].length; i < end; i++) {
|
30
60
|
|
31
|
-
|
61
|
+
if(i === end-1) ht += "?)";
|
32
62
|
|
33
|
-
db = await createDb();
|
34
|
-
|
35
|
-
await run("CREATE TABLE IF NOT EXISTS lorem (id INT, info TEXT)");
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
// 10万件のデータ
|
40
|
-
|
41
|
-
let array = [];
|
42
|
-
|
43
|
-
for (let i = 0; i < 1000000; i++) {
|
44
|
-
|
45
|
-
|
63
|
+
else ht += "?,";
|
46
64
|
|
47
65
|
}
|
48
66
|
|
49
67
|
|
50
68
|
|
51
|
-
//
|
69
|
+
// インサートされない
|
52
70
|
|
71
|
+
let placeholders = languages .map((languages) => ht).join(',');
|
72
|
+
|
53
|
-
|
73
|
+
let sql = 'INSERT INTO lorem VALUES ' + placeholders;
|
74
|
+
|
75
|
+
db.run(sql, languages, function(err) {
|
76
|
+
|
77
|
+
if (err) {
|
78
|
+
|
79
|
+
return console.error(err.message);
|
80
|
+
|
81
|
+
}
|
82
|
+
|
83
|
+
console.log(`Rows inserted ${this.changes}`);
|
84
|
+
|
85
|
+
});
|
86
|
+
|
87
|
+
|
88
|
+
|
89
|
+
// close the database connection
|
90
|
+
|
91
|
+
db.close();
|
54
92
|
|
55
93
|
|
56
94
|
|
57
|
-
let s = ""
|
58
|
-
|
59
|
-
for (let i = 0, end=array.length; i < end; i++) {
|
60
|
-
|
61
|
-
s += "(" + array[i][0] + ", ";
|
62
|
-
|
63
|
-
s += "\"" + array[i][1] + "\"), ";
|
64
|
-
|
65
|
-
}
|
66
|
-
|
67
|
-
s = s.slice(0, -2);
|
68
|
-
|
69
|
-
await run("INSERT INTO lorem VALUES " + s);
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
// クローズするとinsertが反映される??
|
74
|
-
|
75
|
-
await closeDb();
|
76
|
-
|
77
|
-
}
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
// 関数
|
82
|
-
|
83
|
-
function createDb() {
|
84
|
-
|
85
|
-
return new Promise((resolve, reject) => {
|
86
|
-
|
87
|
-
let database = new sqlite3.Database('chain.db', function(err){
|
88
|
-
|
89
|
-
if(err){
|
90
|
-
|
91
|
-
return reject(err);
|
92
|
-
|
93
|
-
}
|
94
|
-
|
95
|
-
return resolve(database);
|
96
|
-
|
97
|
-
});
|
98
|
-
|
99
|
-
})
|
100
|
-
|
101
|
-
}
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
function closeDb() {
|
106
|
-
|
107
|
-
return new Promise((resolve, reject) => {
|
108
|
-
|
109
|
-
db.close(function(err){
|
110
|
-
|
111
|
-
if(err){
|
112
|
-
|
113
|
-
return reject(err);
|
114
|
-
|
115
|
-
}
|
116
|
-
|
117
|
-
return resolve(true);
|
118
|
-
|
119
|
-
});
|
120
|
-
|
121
|
-
})
|
122
|
-
|
123
|
-
}
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
function run(sql, param = []) {
|
128
|
-
|
129
|
-
return new Promise((resolve, reject) => {
|
130
|
-
|
131
|
-
db.run(sql, param, function(err){
|
132
|
-
|
133
|
-
if(err){
|
134
|
-
|
135
|
-
return reject(err);
|
136
|
-
|
137
|
-
}
|
138
|
-
|
139
|
-
return resolve(true);
|
140
|
-
|
141
|
-
});
|
142
|
-
|
143
|
-
})
|
144
|
-
|
145
|
-
}
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
function insert(sql, array) {
|
150
|
-
|
151
|
-
return new Promise((resolve, reject) => {
|
152
|
-
|
153
|
-
let stmt = db.prepare(sql, function(err){
|
154
|
-
|
155
|
-
if(err){
|
156
|
-
|
157
|
-
return reject(err);
|
158
|
-
|
159
|
-
}
|
160
|
-
|
161
|
-
for (let i = 0, end = array.length; i < end; i++) {
|
162
|
-
|
163
|
-
stmt.run.apply(this, array[i]);
|
164
|
-
|
165
|
-
}
|
166
|
-
|
167
|
-
stmt.finalize();
|
168
|
-
|
169
|
-
return resolve(true);
|
170
|
-
|
171
|
-
});
|
172
|
-
|
173
|
-
});
|
174
|
-
|
175
|
-
}
|
176
|
-
|
177
95
|
```
|
8
修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -1,18 +1,10 @@
|
|
1
|
-
Node.jsでSQLite3を実行してみているのですが、
|
1
|
+
Node.jsでSQLite3を実行してみているのですが、疑問点があります。
|
2
2
|
|
3
3
|
SQLite勉強中ですので、基本的なことかもしれないのですが、よろしくお願いいたします。
|
4
4
|
|
5
5
|
|
6
6
|
|
7
7
|
**疑問点**
|
8
|
-
|
9
|
-
- insert後、dbをクローズするとdbファイルに書き込みが始まるのですが、そういうものでしょうか?
|
10
|
-
|
11
|
-
insert関数後に反映されるものではないのですか?
|
12
|
-
|
13
|
-
※実際動かすと、close後に反映されているのでそうなのだろうと思いますが確認させてください。
|
14
|
-
|
15
|
-
|
16
8
|
|
17
9
|
- INSERT INTO lorem VALUES (1, 'b1'), (2, 'b2'), (2, 'b3')のような複数レコードを一括で挿入したいとき、現在の文字列を作成するのではなく、もっとすっきり書く方法はあるでしょうか?[参考](https://www.gesource.jp/weblog/?p=6398)
|
18
10
|
|
7
修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -14,25 +14,9 @@
|
|
14
14
|
|
15
15
|
|
16
16
|
|
17
|
-
- 1万個のデータをのinsertするととても遅いです。もっとはやい方法はありますか?
|
18
|
-
|
19
|
-
5分以上たっても終わりません。
|
20
|
-
|
21
|
-
|
17
|
+
- INSERT INTO lorem VALUES (1, 'b1'), (2, 'b2'), (2, 'b3')のような複数レコードを一括で挿入したいとき、現在の文字列を作成するのではなく、もっとすっきり書く方法はあるでしょうか?[参考](https://www.gesource.jp/weblog/?p=6398)
|
22
|
-
|
23
|
-
もっとすっきり書く方法はあるでしょうか?**
|
24
18
|
|
25
19
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
** 1万個のデータをのinsertするととても遅い件について考えたこと**
|
32
|
-
|
33
|
-
1万個のinsertを順次実行しているため遅い?
|
34
|
-
|
35
|
-
しかしデータベースというのは大きなデータを扱うのが普通?なのにこんなに遅くていいのだろうか。
|
36
20
|
|
37
21
|
|
38
22
|
|
@@ -60,11 +44,11 @@
|
|
60
44
|
|
61
45
|
|
62
46
|
|
63
|
-
// 1万件のデータ
|
47
|
+
// 10万件のデータ
|
64
48
|
|
65
49
|
let array = [];
|
66
50
|
|
67
|
-
for (let i = 0; i < 100000; i++) {
|
51
|
+
for (let i = 0; i < 1000000; i++) {
|
68
52
|
|
69
53
|
array.push([i, "Ipsum " + i]);
|
70
54
|
|
6
修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -18,6 +18,12 @@
|
|
18
18
|
|
19
19
|
5分以上たっても終わりません。
|
20
20
|
|
21
|
+
→ **自己解決しました。[参考](https://www.gesource.jp/weblog/?p=6398)、
|
22
|
+
|
23
|
+
もっとすっきり書く方法はあるでしょうか?**
|
24
|
+
|
25
|
+
|
26
|
+
|
21
27
|
|
22
28
|
|
23
29
|
|
@@ -64,7 +70,27 @@
|
|
64
70
|
|
65
71
|
}
|
66
72
|
|
73
|
+
|
74
|
+
|
75
|
+
// 以下のようなSQLを生成
|
76
|
+
|
77
|
+
// INSERT INTO lorem VALUES (1, 'b1'), (2, 'b2'), (2, 'b3')
|
78
|
+
|
79
|
+
|
80
|
+
|
81
|
+
let s = ""
|
82
|
+
|
83
|
+
for (let i = 0, end=array.length; i < end; i++) {
|
84
|
+
|
85
|
+
s += "(" + array[i][0] + ", ";
|
86
|
+
|
87
|
+
s += "\"" + array[i][1] + "\"), ";
|
88
|
+
|
89
|
+
}
|
90
|
+
|
91
|
+
s = s.slice(0, -2);
|
92
|
+
|
67
|
-
await
|
93
|
+
await run("INSERT INTO lorem VALUES " + s);
|
68
94
|
|
69
95
|
|
70
96
|
|
5
修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -104,7 +104,7 @@
|
|
104
104
|
|
105
105
|
return new Promise((resolve, reject) => {
|
106
106
|
|
107
|
-
db.close(
|
107
|
+
db.close(function(err){
|
108
108
|
|
109
109
|
if(err){
|
110
110
|
|
4
詳細追記
test
CHANGED
File without changes
|
test
CHANGED
@@ -15,6 +15,8 @@
|
|
15
15
|
|
16
16
|
|
17
17
|
- 1万個のデータをのinsertするととても遅いです。もっとはやい方法はありますか?
|
18
|
+
|
19
|
+
5分以上たっても終わりません。
|
18
20
|
|
19
21
|
|
20
22
|
|
3
修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -24,7 +24,7 @@
|
|
24
24
|
|
25
25
|
1万個のinsertを順次実行しているため遅い?
|
26
26
|
|
27
|
-
しかしデータベースというのは大きなデータを扱うのが普通なのにこんなに遅くていいのだろうか。
|
27
|
+
しかしデータベースというのは大きなデータを扱うのが普通?なのにこんなに遅くていいのだろうか。
|
28
28
|
|
29
29
|
|
30
30
|
|
2
修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -3,6 +3,8 @@
|
|
3
3
|
SQLite勉強中ですので、基本的なことかもしれないのですが、よろしくお願いいたします。
|
4
4
|
|
5
5
|
|
6
|
+
|
7
|
+
**疑問点**
|
6
8
|
|
7
9
|
- insert後、dbをクローズするとdbファイルに書き込みが始まるのですが、そういうものでしょうか?
|
8
10
|
|
@@ -13,6 +15,16 @@
|
|
13
15
|
|
14
16
|
|
15
17
|
- 1万個のデータをのinsertするととても遅いです。もっとはやい方法はありますか?
|
18
|
+
|
19
|
+
|
20
|
+
|
21
|
+
|
22
|
+
|
23
|
+
** 1万個のデータをのinsertするととても遅い件について考えたこと**
|
24
|
+
|
25
|
+
1万個のinsertを順次実行しているため遅い?
|
26
|
+
|
27
|
+
しかしデータベースというのは大きなデータを扱うのが普通なのにこんなに遅くていいのだろうか。
|
16
28
|
|
17
29
|
|
18
30
|
|
1
修正
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
SQLiteについて
|
test
CHANGED
File without changes
|