想像してみてください。あなたはアプリケーションを書いていて、データベースが必要です。通常、これはMySQLまたはPostgreSQLのインストール、サーバーの設定、ユーザーの作成、セキュリティの設定を意味します...ストップ。もし、これらすべてなしで動作するデータベースがあると言ったらどうでしょうか?
SQLiteをご紹介します。これは単なる軽量な代替手段ではなく、データを扱うためのまったく異なるアプローチです。そして、あなたが初心者の開発者であれば、SQLiteはあなたのキャリアの始まりにあなたの親友になる可能性があります。
SQLite とは何か、なぜ特別なのか
SQLiteは、組み込みのリレーショナルデータベースです。しかし、「組み込み」とはどういう意味でしょうか?個別のサーバーとして動作する MySQL や PostgreSQL とは異なり、SQLite はアプリケーションに接続する単なるライブラリです。データベース全体がディスク上の 1 つのファイルに保存されます。
簡単に聞こえますか? それはその通りだからです。SQLite では、サーバーのインストール、ポートの設定、ユーザーの作成は必要ありません。拡張子 .db または .sqlite を持つファイルを作成するだけで、本格的なデータベースができます。
SQLiteがユニークである理由は、これが世界で最も一般的なデータベースであることです。これは、AndroidとiOSのすべてのスマートフォン、ChromeとFirefoxのブラウザ、WindowsとmacOSのオペレーティングシステムに組み込まれています。開発者の推定によると、1兆を超えるアクティブなSQLiteデータベースが存在します。そうです、1兆はゼロが12個ついた数字です。
SQLiteの使用場所
SQLiteは、データベースレベルでマルチユーザー作業を必要としないタスクに最適です。これらは、デスクトップアプリケーション、モバイルアプリケーション、組み込みシステム、Webアプリケーションのプロトタイプ、ブラウザーのローカルデータストレージです。
具体的な例は?
WhatsAppのようなメッセンジャーは、SQLiteを使用して通信履歴を携帯電話に保存します。ブラウザはブックマーク、履歴、CookieをSQLiteに保存します。ゲームはプレイヤーの進捗状況をSQLiteに保存します。Dropboxでも、ファイルのメタデータを同期するためにSQLiteを使用しています。
SQLiteが適していない場合
数千の同時接続を持つ高負荷のWebサービスをお持ちの場合は、PostgreSQLを選択することをお勧めします。サーバー間でデータを複製する必要がある場合、SQLiteでは対応できません。データがテラバイト単位で測定される場合は、他のソリューションを探してください。
インストールと最初のステップ
良いニュース:SQLiteはすでにコンピューターにインストールされている可能性があります。ターミナルを開き、コマンドsqlite3 --versionを入力します。バージョンを見ましたか?素晴らしい、仕事を始めることができます。
SQLiteがインストールされていない場合、インストールプロセスには1分かかります。Windowsでは、公式サイトからプリコンパイルされたバイナリをダウンロードしてください。Linuxでは、パッケージマネージャーを使用します。Ubuntuの場合はsudo apt install sqlite3、CentOSの場合はsudo yum install sqliteです。macOSでは、通常、SQLiteはすでにインストールされていますが、Homebrewコマンドbrew install sqlite3を使用して更新できます。
最初のデータベースを作成しましょう。ターミナルを開き、コマンド sqlite3 myapp.dbを入力します。sqlite>というプレフィックスのSQLiteプロンプトが表示されます。おめでとうございます。データベースを作成しました。はい、それはとても簡単でした。
コマンドラインを介した作業の基礎
SQLiteには、便利なコマンドを備えたインタラクティブシェルがあります。すべての特別なコマンドはドットで始まります。.helpコマンドは、使用可能なコマンドのリストを表示します。.databasesコマンドは、接続されたデータベースを表示します。.tables コマンドは、現在のデータベース内のすべてのテーブルを表示します。.schemaコマンドは、すべてのテーブルの構造を表示します。.quit または .exit コマンドは、SQLite を終了します。
最初のテーブルを作成してみましょう。タスクを追跡するためのアプリケーションを作成しているとします。
CREATE TABLE tasks (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
description TEXT,
completed INTEGER DEFAULT 0,
created_at TEXT DEFAULT CURRENT_TIMESTAMP
);何が起こっているのでしょうか? 5つの列を持つテーブルを作成しました。列 id は自動増加プライマリキーで、自動的に生成されます。列 title はテキストで、必須フィールドです。列 description はテキストで、空にすることができます。列completedは数値で、デフォルトは0です(ブールフラグとして使用します)。列 created_at はテキストで、現在の日付が自動的に入力されます。
データ型に注意してください。SQLiteは動的型付けを使用し、5つの基本的なストレージタイプをサポートしています。NULL(値なし)、INTEGER(整数)、REAL(浮動小数点数)、TEXT(テキスト文字列)、BLOB(バイナリデータ)です。これは他のデータベースよりも簡単ですが、ほとんどのタスクでは十分です。
データの基本操作
次に、テーブルにいくつかのタスクを追加します。
INSERT INTO tasks (title, description)
VALUES ('Learn SQLite', 'Read the article and try the examples');
INSERT INTO tasks (title, description)
VALUES ('Write code', 'Create a simple application with SQLite');
INSERT INTO tasks (title)
VALUES ('Mark task as completed');結果を見てみましょう。
SELECT * FROM tasks;自動生成されたIDと作成日を含む3つのレコードが表示されます。3番目のエントリのフィールドdescriptionはNULLになります。指定していません。
最初のタスクを完了としてマークしましょう。
UPDATE tasks
SET completed = 1
WHERE id = 1;今度は未完了のタスクのみを選択します。
SELECT id, title, completed
FROM tasks
WHERE completed = 0;タスクを削除する必要がある場合:
DELETE FROM tasks
WHERE id = 3;これらの4つの操作(SELECT、INSERT、UPDATE、DELETE)は、任意のリレーショナルデータベースを操作するための基礎を構成します。SQLiteの構文は標準SQLとほぼ同じであるため、知識を他のDBMSに簡単に転用できます。
PythonからのSQLiteの操作
SQLiteの最良の部分は、サポートがPython標準ライブラリに直接組み込まれていることです。追加のパッケージをインストールする必要はありません。sqlite3モジュールはすでに存在します。
以下は、最小限の作業例です。
import sqlite3
# データベースに接続します(ファイルは自動的に作成されます)
conn = sqlite3.connect('myapp.db')
cursor = conn.cursor()
# 表を作成する
cursor.execute('''
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL UNIQUE,
email TEXT NOT NULL,
created_at TEXT DEFAULT CURRENT_TIMESTAMP
)
''')
# ユーザーを追加しています
cursor.execute(
'INSERT INTO users (username, email) VALUES (?, ?)',
('john_doe', 'john@example.com')
)
# 変更を保存しています
conn.commit()
# すべてのユーザーを取得しています
cursor.execute('SELECT * FROM users')
users = cursor.fetchall()
for user in users:
print(f"ID: {user[0]}, Username: {user[1]}, Email: {user[2]}")
# 接続を閉じる
conn.close()INSERTクエリの疑問符に注意してください。これらはパラメーターのプレースホルダーであり、SQLクエリにデータを渡す正しい方法です。SQL にデータを挿入するために f 文字列または連結を使用しないでください。これにより、SQL インジェクションの扉が開きます。
より便利な方法は、コンテキストマネージャーを使用することです。
import sqlite3
with sqlite3.connect('myapp.db') as conn:
cursor = conn.cursor()
# タプルの代わりに辞書として結果を取得する
conn.row_factory = sqlite3.Row
cursor.execute('SELECT * FROM users WHERE username = ?', ('john_doe',))
user = cursor.fetchone()
if user:
print(f"User found: {user['username']}, {user['email']}")with 構造は、接続を自動的に閉じて変更を保存します。そして、row_factory = sqlite3.Row を使用すると、インデックスの代わりに名前で列を参照できます。これは、はるかに便利です。

JavaScriptからのSQLiteの操作
Node.jsでSQLiteを操作するための最も人気のあるライブラリはbetter-sqlite3です。同期していて、非常に高速です。
まず、パッケージをインストールします。
npm install better-sqlite3これでデータベースを操作できます。
const Database = require('better-sqlite3');
const db = new Database('myapp.db');
// 表を作成する
db.exec(`
CREATE TABLE IF NOT EXISTS products (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
price REAL NOT NULL,
stock INTEGER DEFAULT 0
)
`);
// 挿入のために準備されたクエリ
const insert = db.prepare(
'INSERT INTO products (name, price, stock) VALUES (?, ?, ?)'
);
// 複数の商品を追加します
const products = [
['Laptop', 45999.99, 5],
['Mouse', 599.00, 20],
['Keyboard', 1299.00, 15]
];
for (const product of products) {
insert.run(product);
}
// すべての商品を受け取ります
const allProducts = db.prepare('SELECT * FROM products').all();
console.log('All products:', allProducts);
// 1つの商品を受け取ります
const laptop = db.prepare('SELECT * FROM products WHERE name = ?').get('Laptop');
console.log('Product found:', laptop);
// データベースを閉じる
db.close();better-sqlite3の利点は、同期であることです。簡単な操作のために、promisesとasync/awaitを扱う必要はありません。より複雑なスクリプトの場合、ブラウザでは、異なる原則で動作するWeb SQL(旧式)またはIndexedDBが使用されます。
実用的なヒントとベストプラクティス
最初のルール:複数の関連トランザクションには常にトランザクションを使用してください。これにより、データの整合性が確保されるだけでなく、作業が大幅に高速化されます。
conn = sqlite3.connect('myapp.db')
cursor = conn.cursor()
try:
cursor.execute('BEGIN TRANSACTION')
# 多数の挿入操作
for i in range(1000):
cursor.execute('INSERT INTO logs (message) VALUES (?)', (f'Log {i}',))
cursor.execute('COMMIT')
except Exception as e:
cursor.execute('ROLLBACK')
print(f'Error: {e}')
finally:
conn.close()トランザクションなしでは、1000回の挿入には数秒かかる場合があります。トランザクションでは、数分の1秒です。
2 つ目のヒント: 頻繁にクエリされる列にインデックスを使用します。メールでユーザーを頻繁に検索する場合は、インデックスを作成します。
CREATE INDEX idx_users_email ON users(email);インデックスは SELECT クエリを高速化しますが、INSERT と UPDATE を低速化します。賢く使用してください。
3 番目のポイント: データベースを最適化するために VACUUM コマンドを定期的に使用します。SQLite は、レコードを削除するときに自動的にスペースを解放しません。
VACUUM;このコマンドはデータベースを再構築し、未使用のスペースを解放してファイル構造を最適化します。
4つ目は、バックアップを取ることです。SQLiteは単なるファイルなので、バックアップは簡単です。.db ファイルを安全な場所にコピーするだけです。ただし、データベースがアクティブに使用されていないときに行うか、オンラインバックアップの特別なコマンドを使用してください。
知っておくべき制限事項
SQLiteは素晴らしいですが、制限があります。データベースのサイズは理論的には281テラバイトに達する可能性がありますが、実際には数ギガバイトを超えないことをお勧めします。SQLiteはデータベース全体のロックを使用します。つまり、書き込み中は他のプロセスは読み取ることができません。これはローカルアプリケーションでは問題ありませんが、負荷の高いサーバーでは問題があります。
ユーザーとアクセス権のサポートが組み込まれていません。セキュリティはファイルシステムレベルで提供されます。複製とクラスタリングは標準ではありません。ウィンドウ関数のような高度なSQL関数がいくつかありません(ただし、基本的なサポートは新しいバージョンで追加されました)。
しかし、初心者の開発者のタスクの90%にとって、これらの制限は重要ではありません。SQLiteは、ローカルアプリケーションの学習、プロトタイピング、および作成に最適なツールです。
SQLite を操作するためのツール
コマンドラインは良いですが、時には視覚的なインターフェースが必要です。SQLiteには多くのGUIツールがあります。DB Browser for SQLiteは、無料のクロスプラットフォームのオープンソースツールで、初心者に最適です。SQLiteStudioは、プラグインをサポートするもう1つの無料オプションです。プロフェッショナルには、JetBrainsのDataGripや、SQLite ViewerのようなVS Code拡張機能があります。
個人的には、DB Browserから始めることをお勧めします。直感的に理解でき、表を視覚的に作成したり、表形式でデータを表示したり、構文強調表示付きのSQLクエリを実行したり、さまざまな形式でデータをエクスポートしたりできます。
実践課題
学ぶ最良の方法は練習です。簡単な経費管理アプリを作成してみてください。データベースには、費用の表(日付、カテゴリ、金額、説明)とカテゴリの表(名前、視覚化のための色)が含まれている必要があります。新しい経費の追加、特定の期間のすべての経費の表示、カテゴリ別の経費のグループ化、合計金額の計算を実装します。
これは小さなプロジェクトですが、データベースのすべての主要な操作をカバーし、SQLiteの実務経験を提供します。
結論
SQLiteは、初心者向けの単なるデータベースではありません。これは、何百万ものアプリケーションの本番環境で使用されている強力なツールです。インストールと使用が簡単なため、学習に最適です。信頼性とパフォーマンスは、実際のプロジェクトに最適な選択肢です。
SQLiteから始めて、データベースの基本を習得し、SQLの原則を理解してください。そうすれば、PostgreSQLまたはMySQLへの移行は簡単で自然になります。結局のところ、コンセプトはどこでも同じであり、変わるのはスケールと追加機能の数だけです。
したがって、SQLiteをインストールし、最初のテーブルを作成して、実験を開始します。それは見た目よりも簡単で、想像以上に興味深いものです。
コディック — Python、JavaScript、Web開発のコースを提供する、初心者向けのプログラミング教育プラットフォーム。
私たちの Telegramコミュニティ コードに関する質問やサポート、共同学習のための仲間を見つけることができます。
