質問編集履歴

10

修正

2020/01/08 14:16

投稿

退会済みユーザー
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

修正

2020/01/08 14:16

投稿

退会済みユーザー
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')のような複数レコードを一括で挿入したいとき、現在文字列を作成するのではなくもっとすっきり書く方法はあるでしょうか?[参考](https://www.gesource.jp/weblog/?p=6398)
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
- ``` javascript
33
+ if (err) {
18
34
 
19
- const sqlite3 = require('sqlite3');
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
- let db = null;
47
+ db.close();
48
+
49
+ ```
22
50
 
23
51
 
24
52
 
25
- Test();
53
+ ```javascript
26
54
 
55
+ let languages = [[0, 'C++'], [1, 'Python'], [2, 'Java'], [3, 'C#'], [4, 'Go']];
27
56
 
57
+ ht = "(";
28
58
 
29
- async function Test() {
59
+ for (let i = 0, end = languages [0].length; i < end; i++) {
30
60
 
31
- // SQL処理
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
- array.push([i, "Ipsum " + i]);
63
+ else ht += "?,";
46
64
 
47
65
  }
48
66
 
49
67
 
50
68
 
51
- // 以下のようSQLを生成
69
+  // インサートされ
52
70
 
71
+ let placeholders = languages .map((languages) => ht).join(',');
72
+
53
- // INSERT INTO lorem VALUES (1, 'b1'), (2, 'b2'), (2, 'b3')
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

修正

2020/01/08 14:15

投稿

退会済みユーザー
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

修正

2020/01/08 13:49

投稿

退会済みユーザー
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
-  **自己解決た。[参考](https://www.gesource.jp/weblog/?p=6398)
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

修正

2020/01/08 13:48

投稿

退会済みユーザー
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 insert("INSERT INTO lorem(id, info) VALUES (?, ?)", array);
93
+ await run("INSERT INTO lorem VALUES " + s);
68
94
 
69
95
 
70
96
 

5

修正

2020/01/08 13:45

投稿

退会済みユーザー
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(sql, param, function(err){
107
+ db.close(function(err){
108
108
 
109
109
  if(err){
110
110
 

4

詳細追記

2020/01/08 13:20

投稿

退会済みユーザー
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

修正

2020/01/08 12:15

投稿

退会済みユーザー
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

修正

2020/01/08 12:04

投稿

退会済みユーザー
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

修正

2020/01/08 11:59

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- NoldeでのSQLiteについて
1
+ SQLiteについて
test CHANGED
File without changes