1
0

More than 1 year has passed since last update.

nodejsでsqlite3のデータを表示する

Posted at

やりたいこと

sqliteにテストデータを作成しconsoleに表示する。

書いたコード

install
npm install sqlite3
テストデータの作成と表示
const sqlite3 = require('sqlite3').verbose();

// データベース接続の作成
const db = new sqlite3.Database('mydatabase.db');

// テーブル作成のクエリ
const createTableQuery = `
  CREATE TABLE IF NOT EXISTS users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT,
    email TEXT
  )
`;

// テーブルの作成
db.run(createTableQuery, function(err) {
  if (err) {
    console.error(err.message);
  } else {
    console.log('テーブルが作成されました');
  }
});

// ユーザーの挿入クエリ
const insertUserQuery = `
  INSERT INTO users (name, email)
  VALUES (?, ?)
`;

// ユーザーのデータ
const user = {
  name: 'John Doe',
  email: 'john@example.com',
};

// ユーザーの挿入
db.run(insertUserQuery, [user.name, user.email], function(err) {
  if (err) {
    console.error(err.message);
  } else {
    console.log('ユーザーが追加されました');
  }
});

// ユーザーの取得クエリ
const getUsersQuery = 'SELECT * FROM users';

// ユーザーの取得
db.all(getUsersQuery, function(err, rows) {
  if (err) {
    console.error(err.message);
  } else {
    rows.forEach(row => {
      console.log(row);
    });
  }
});

// データベース接続のクローズ
db.close();

上記コードを実行すると、2回目以降は正常にuserが取れているが、初回はエラーになっている...
db.runの中身が非同期で動いているのが原因なので、同期的に動くように修正してあげる。

初回
SQLITE_ERROR: no such table: users
SQLITE_ERROR: no such table: users
テーブルが作成されました
2回目以降
テーブルが作成されました
ユーザーが追加されました
{ id: 1, name: 'John Doe', email: 'john@example.com' }

db.serializeを使うと同期的にクエリを流すことができます。

修正後
const sqlite3 = require('sqlite3').verbose();
// データベース接続の作成
const db = new sqlite3.Database('mydatabase.db');


// テーブル作成のクエリ
const createTableQuery = `
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
email TEXT
)
`;

// ユーザーの挿入クエリ
const insertUserQuery = `
INSERT INTO users (name, email)
VALUES (?, ?)
`;

// ユーザーのデータ
const user = {
name: 'John Doe',
email: 'john@example.com',
};

// ユーザーの取得クエリ
const getUsersQuery = 'SELECT * FROM users';

db.serialize(() => {
    // テーブルの作成
    db.run(createTableQuery, function(err) {
        if (err) {
            console.error(err.message);
        } else {
            console.log('テーブルが作成されました');
        }
    });

    // ユーザーの挿入
    db.run(insertUserQuery, [user.name, user.email], function(err) {
        if (err) {
            console.error(err.message);
        } else {
            console.log('ユーザーが追加されました');
        }
    });

    // ユーザーの取得
    db.all(getUsersQuery, function(err, rows) {
        if (err) {
            console.error(err.message);
        } else {
            rows.forEach(row => {
            console.log(row);
            });
        }
    });

    console.log('end serialize');
});
console.log('after serialize');


// データベース接続のクローズ
db.close();
end serialize
after serialize
テーブルが作成されました
ユーザーが追加されました
{ id: 1, name: 'John Doe', email: 'john@example.com' }
{ id: 2, name: 'John Doe', email: 'john@example.com' }

クエリ自体は同期的に動いてくれるが、クエリの完了を待つ訳ではないのでそこは注意が必要です。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0