やりたいこと
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' }
クエリ自体は同期的に動いてくれるが、クエリの完了を待つ訳ではないのでそこは注意が必要です。