teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

10

修正

2020/01/08 14:16

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -4,7 +4,8 @@
4
4
  **疑問点**
5
5
  - INSERT INTO lorem VALUES (1, 'b1'), (2, 'b2'), (2, 'b3')のような複数レコードを一括で挿入したいとき、上の例では、'(?),'(?)','(?)'ですが、
6
6
  '(?,?),'(?,?)','(?,?)'に対応するにはどうすればいいのでしょうか?
7
+
7
-     
8
+ **例**
8
9
  ```javascript
9
10
  let languages = ['C++', 'Python', 'Java', 'C#', 'Go'];
10
11
 
@@ -24,6 +25,7 @@
24
25
  db.close();
25
26
  ```
26
27
 
28
+ **上の例をみて複数に対応してみようとしたもの**
27
29
  ```javascript
28
30
  let languages = [[0, 'C++'], [1, 'Python'], [2, 'Java'], [3, 'C#'], [4, 'Go']];
29
31
  ht = "(";

9

修正

2020/01/08 14:16

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -2,88 +2,47 @@
2
2
  SQLite勉強中ですので、基本的なことかもしれないのですが、よろしくお願いいたします。
3
3
 
4
4
  **疑問点**
5
- - INSERT INTO lorem VALUES (1, 'b1'), (2, 'b2'), (2, 'b3')のような複数レコードを一括で挿入したいとき、現在文字列を作成するのではなくもっとすっきり書く方法はあるでしょうか?[参考](https://www.gesource.jp/weblog/?p=6398)
5
+ - INSERT INTO lorem VALUES (1, 'b1'), (2, 'b2'), (2, 'b3')のような複数レコードを一括で挿入したいとき、では、'(?),'(?)','(?)'ですが、
6
+ '(?,?),'(?,?)','(?,?)'に対応するにはどうすればいいのでしょうか?
6
7
      
8
+ ```javascript
9
+ let languages = ['C++', 'Python', 'Java', 'C#', 'Go'];
10
+
11
+ // construct the insert statement with multiple placeholders
12
+ // based on the number of rows
13
+ let placeholders = languages.map((language) => '(?)').join(',');
14
+ let sql = 'INSERT INTO langs(name) VALUES ' + placeholders;
7
15
 
8
-
9
- ``` javascript
10
- const sqlite3 = require('sqlite3');
11
- let db = null;
12
-
13
- Test();
14
-
15
- async function Test() {
16
+ db.run(sql, languages, function(err) {
16
- // SQL処理
17
- db = await createDb();
18
- await run("CREATE TABLE IF NOT EXISTS lorem (id INT, info TEXT)");
19
-
20
- // 10万件のデータ
21
- let array = [];
17
+ if (err) {
22
- for (let i = 0; i < 1000000; i++) {
18
+ return console.error(err.message);
23
- array.push([i, "Ipsum " + i]);
24
19
  }
20
+ console.log(`Rows inserted ${this.changes}`);
21
+ });
22
+
23
+ // close the database connection
24
+ db.close();
25
+ ```
25
26
 
26
- // 以下のようなSQLを生成
27
+ ```javascript
27
- // INSERT INTO lorem VALUES (1, 'b1'), (2, 'b2'), (2, 'b3')
28
+ let languages = [[0, 'C++'], [1, 'Python'], [2, 'Java'], [3, 'C#'], [4, 'Go']];
28
-
29
- let s = ""
29
+ ht = "(";
30
- for (let i = 0, end=array.length; i < end; i++) {
30
+ for (let i = 0, end = languages [0].length; i < end; i++) {
31
- s += "(" + array[i][0] + ", ";
31
+ if(i === end-1) ht += "?)";
32
- s += "\"" + array[i][1] + "\"), ";
32
+ else ht += "?,";
33
33
  }
34
- s = s.slice(0, -2);
35
- await run("INSERT INTO lorem VALUES " + s);
36
34
 
37
- // クロズするとinsertが反映される??
35
+  // インサされない
36
+ let placeholders = languages .map((languages) => ht).join(',');
37
+ let sql = 'INSERT INTO lorem VALUES ' + placeholders;
38
+ db.run(sql, languages, function(err) {
38
- await closeDb();
39
+ if (err) {
40
+ return console.error(err.message);
39
- }
41
+ }
42
+ console.log(`Rows inserted ${this.changes}`);
43
+ });
44
+
45
+ // close the database connection
46
+ db.close();
40
47
 
41
- // 関数
42
- function createDb() {
43
- return new Promise((resolve, reject) => {
44
- let database = new sqlite3.Database('chain.db', function(err){
45
- if(err){
46
- return reject(err);
47
- }
48
- return resolve(database);
49
- });
50
- })
51
- }
52
-
53
- function closeDb() {
54
- return new Promise((resolve, reject) => {
55
- db.close(function(err){
56
- if(err){
57
- return reject(err);
58
- }
59
- return resolve(true);
60
- });
61
- })
62
- }
63
-
64
- function run(sql, param = []) {
65
- return new Promise((resolve, reject) => {
66
- db.run(sql, param, function(err){
67
- if(err){
68
- return reject(err);
69
- }
70
- return resolve(true);
71
- });
72
- })
73
- }
74
-
75
- function insert(sql, array) {
76
- return new Promise((resolve, reject) => {
77
- let stmt = db.prepare(sql, function(err){
78
- if(err){
79
- return reject(err);
80
- }
81
- for (let i = 0, end = array.length; i < end; i++) {
82
- stmt.run.apply(this, array[i]);
83
- }
84
- stmt.finalize();
85
- return resolve(true);
86
- });
87
- });
88
- }
89
48
  ```

8

修正

2020/01/08 14:15

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -1,11 +1,7 @@
1
- Node.jsでSQLite3を実行してみているのですが、いくつか疑問点があります。
1
+ Node.jsでSQLite3を実行してみているのですが、疑問点があります。
2
2
  SQLite勉強中ですので、基本的なことかもしれないのですが、よろしくお願いいたします。
3
3
 
4
4
  **疑問点**
5
- - insert後、dbをクローズするとdbファイルに書き込みが始まるのですが、そういうものでしょうか?
6
-  insert関数後に反映されるものではないのですか?
7
-  ※実際動かすと、close後に反映されているのでそうなのだろうと思いますが確認させてください。
8
-
9
5
  - INSERT INTO lorem VALUES (1, 'b1'), (2, 'b2'), (2, 'b3')のような複数レコードを一括で挿入したいとき、現在の文字列を作成するのではなく、もっとすっきり書く方法はあるでしょうか?[参考](https://www.gesource.jp/weblog/?p=6398)
10
6
      
11
7
 

7

修正

2020/01/08 13:49

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -6,18 +6,10 @@
6
6
   insert関数後に反映されるものではないのですか?
7
7
   ※実際動かすと、close後に反映されているのでそうなのだろうと思いますが確認させてください。
8
8
 
9
- - 1万個のデータをのinsertするととても遅いです。もっとはやい方法はありますか?
10
- 5分以上たっても終わりません。
11
-  **自己解決まし[参考](https://www.gesource.jp/weblog/?p=6398)
9
+ - INSERT INTO lorem VALUES (1, 'b1'), (2, 'b2'), (2, 'b3')のような複数レコードを一括で挿入したいとき、現在の文字列を作成するのではなく、もっとすっきり書く方法はあるでしょうか?[参考](https://www.gesource.jp/weblog/?p=6398)
12
- もっとすっきり書く方法はあるでしょうか?**
13
10
      
14
11
 
15
12
 
16
- ** 1万個のデータをのinsertするととても遅い件について考えたこと**
17
- 1万個のinsertを順次実行しているため遅い?
18
- しかしデータベースというのは大きなデータを扱うのが普通?なのにこんなに遅くていいのだろうか。
19
-
20
-
21
13
  ``` javascript
22
14
  const sqlite3 = require('sqlite3');
23
15
  let db = null;
@@ -29,9 +21,9 @@
29
21
  db = await createDb();
30
22
  await run("CREATE TABLE IF NOT EXISTS lorem (id INT, info TEXT)");
31
23
 
32
- // 1万件のデータ
24
+ // 10万件のデータ
33
25
  let array = [];
34
- for (let i = 0; i < 100000; i++) {
26
+ for (let i = 0; i < 1000000; i++) {
35
27
  array.push([i, "Ipsum " + i]);
36
28
  }
37
29
 

6

修正

2020/01/08 13:48

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -8,6 +8,9 @@
8
8
 
9
9
  - 1万個のデータをのinsertするととても遅いです。もっとはやい方法はありますか?
10
10
  5分以上たっても終わりません。
11
+ → **自己解決しました。[参考](https://www.gesource.jp/weblog/?p=6398)、
12
+ もっとすっきり書く方法はあるでしょうか?**
13
+     
11
14
 
12
15
 
13
16
  ** 1万個のデータをのinsertするととても遅い件について考えたこと**
@@ -31,8 +34,18 @@
31
34
  for (let i = 0; i < 100000; i++) {
32
35
  array.push([i, "Ipsum " + i]);
33
36
  }
34
- await insert("INSERT INTO lorem(id, info) VALUES (?, ?)", array);
35
37
 
38
+ // 以下のようなSQLを生成
39
+ // INSERT INTO lorem VALUES (1, 'b1'), (2, 'b2'), (2, 'b3')
40
+
41
+ let s = ""
42
+ for (let i = 0, end=array.length; i < end; i++) {
43
+ s += "(" + array[i][0] + ", ";
44
+ s += "\"" + array[i][1] + "\"), ";
45
+ }
46
+ s = s.slice(0, -2);
47
+ await run("INSERT INTO lorem VALUES " + s);
48
+
36
49
  // クローズするとinsertが反映される??
37
50
  await closeDb();
38
51
  }

5

修正

2020/01/08 13:45

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -51,7 +51,7 @@
51
51
 
52
52
  function closeDb() {
53
53
  return new Promise((resolve, reject) => {
54
- db.close(sql, param, function(err){
54
+ db.close(function(err){
55
55
  if(err){
56
56
  return reject(err);
57
57
  }

4

詳細追記

2020/01/08 13:20

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -7,6 +7,7 @@
7
7
   ※実際動かすと、close後に反映されているのでそうなのだろうと思いますが確認させてください。
8
8
 
9
9
  - 1万個のデータをのinsertするととても遅いです。もっとはやい方法はありますか?
10
+ 5分以上たっても終わりません。
10
11
 
11
12
 
12
13
  ** 1万個のデータをのinsertするととても遅い件について考えたこと**

3

修正

2020/01/08 12:15

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -11,7 +11,7 @@
11
11
 
12
12
  ** 1万個のデータをのinsertするととても遅い件について考えたこと**
13
13
  1万個のinsertを順次実行しているため遅い?
14
- しかしデータベースというのは大きなデータを扱うのが普通なのにこんなに遅くていいのだろうか。
14
+ しかしデータベースというのは大きなデータを扱うのが普通なのにこんなに遅くていいのだろうか。
15
15
 
16
16
 
17
17
  ``` javascript

2

修正

2020/01/08 12:04

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -1,6 +1,7 @@
1
1
  Node.jsでSQLite3を実行してみているのですが、いくつか疑問点があります。
2
2
  SQLite勉強中ですので、基本的なことかもしれないのですが、よろしくお願いいたします。
3
3
 
4
+ **疑問点**
4
5
  - insert後、dbをクローズするとdbファイルに書き込みが始まるのですが、そういうものでしょうか?
5
6
   insert関数後に反映されるものではないのですか?
6
7
   ※実際動かすと、close後に反映されているのでそうなのだろうと思いますが確認させてください。
@@ -8,6 +9,11 @@
8
9
  - 1万個のデータをのinsertするととても遅いです。もっとはやい方法はありますか?
9
10
 
10
11
 
12
+ ** 1万個のデータをのinsertするととても遅い件について考えたこと**
13
+ 1万個のinsertを順次実行しているため遅い?
14
+ しかしデータベースというのは大きなデータを扱うのが普通なのにこんなに遅くていいのだろうか。
15
+
16
+
11
17
  ``` javascript
12
18
  const sqlite3 = require('sqlite3');
13
19
  let db = null;

1

修正

2020/01/08 11:59

投稿

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