Pythonとデータベースで登録アプリを作成する方法

Pythonは標準ライブラリに優れたデータベースサポートが内蔵されているため、Django ORMなどの外部フレームワークに依存することなく、データベースを作成して操作することができます。

SQLiteは軽量で、Pythonと簡単に統合できます。シンプルなユーザー登録アプリで、Pythonでのデータベースプログラミングの基本原則を理解しましょう。

Pythonでデータベースを作成する方法

このチュートリアルで使用されるコードは、このGitHubリポジトリにあります。

Pythonでデータベースを作成して操作するには、主に2つのものが必要です。接続カーソルです。

接続は、既存のデータベースに接続するか、新しいデータベースを作成するのに役立ちます。SQLiteを使用してPythonでデータベース接続を作成する方法は次のとおりです。

import sqlite3# (新規)データベースに接続conn = sqlite3.connect('path/to/database.db')# 接続を閉じるconn.close()

connect()メソッドは、既存のデータベースへのパスを受け取ります。指定されたパスにデータベースがない場合、データベースが作成されます。データベースとの操作が完了したら、データベース接続を閉じる必要があります。

カーソルは、接続されたデータベースとの操作に役立ちます。Pythonプログラム内でSQLクエリを実行するためにカーソルを使用します。カーソルを作成する方法は次のとおりです。

cursor = conn.cursor()# カーソルを閉じるcursor.close()

開いている接続オブジェクトでcursor()メソッドを呼び出すことで、カーソルを作成できます。

Pythonでデータベーストランザクションを実行する方法

カーソルを使用すると、データの読み取りや書き込み、データベース構造の変更を行うために、SQLステートメント、クエリ、またはスクリプトを実行できます。

データベーストランザクションを実行するために使用できる主なメソッドは3つあります。

  1. Cursor.execute。このメソッドは単一のSQLステートメントを実行します。使用方法は次のとおりです。
    cursor.execute("""CREATE TABLE IF NOT EXISTS users (name TEXT,age INTEGER)""")
    このコードはカーソルでexecuteメソッドを呼び出し、SQLステートメントを含む文字列を渡します。
  2. Cursor.executemany。このメソッドを使用すると、異なるパラメータを毎回使用して、同じSQLステートメントを複数回実行できます。SQLステートメントとイテラブルの2つの引数を取ります。データベースに一度に複数のオブジェクトを挿入するために使用するのが適しています。
    data = [('Alice', 25),('Bob', 30),('Charlie', 22)]cursor.executemany("""INSERT INTO users (name, age) VALUES (?, ?)""", data)
    上記のコードは、executemanyメソッドを使用して、データベースに値を複数回挿入しています。

    SQLステートメントの?プレースホルダーに注目してください。executemanyメソッドは、各オブジェクトに対応する値でこれらを置き換えます。

  3. Cursor.executescript。名前が示すように、このメソッドはSQLスクリプトを実行します。SQLステートメントを別のファイルに記述し、executescriptメソッドで実行できます。
    with open("path/to/script.sql") as file:sql_script = file.read()cursor.executescript(sql_script)

PythonとSQLite3で登録アプリを構築する方法

登録アプリの背後にあるロジックは、Pythonを使用してユーザーの情報を取得し、データベースに格納することです。これらの手順では、PythonとSQLite3を使用してシンプルな登録システムを作成する方法を説明します。

手順1:既存のデータベースに接続するか、新しいデータベースを作成する

最初に、アプリのデータベースを作成するか、既存のデータベースに接続します。

import sqlite3conn = sqlite3.connect('database.db')cursor = conn.cursor()# アプリのコードをここに記述cursor.close()conn.close()

上記のコードは、接続オブジェクトとカーソルを作成して、接続されたデータベースと操作できるようにします。

手順2:ユーザーのテーブルを作成する

ユーザーが登録時に提供するデータを格納するためのテーブルが必要です。カーソルを使用して作成する方法は次のとおりです。

cursor.execute("""CREATE TABLE IF NOT EXISTS users (first_name TEXT,last_name TEXT,email TEXT UNIQUE,password TEXT)""")conn.commit()

このコードは、データベースに存在しない場合にusersというテーブルを作成します。ユーザー情報を保持するためにテーブルに4つの列を作成します。emailフィールドは一意であるため、ユーザーが同じemailで複数のアカウントを作成することができません。

conn.commitの呼び出しは、クエリをデータベースにコミットするために重要です。これがないと、データベースに変更はありません。

executescriptメソッドを使用する場合、SQLファイルの最後にCOMMITキーワードを追加することで、conn.commitを呼び出す必要がなくなります。

手順3:ユーザーデータを収集する

Python関数はコードを再利用しやすいため、登録機能を処理する関数を用意すると便利です。この関数は、ユーザーの名前、姓、メールアドレス、パスワードを収集します。

def register_user():first_name = input("Enter your first name: ")last_name = input("Enter your last name: ")email = input("Enter your email: ")password1 = input("Enter your password: ")password2 = input("Confirm your password: ")

手順4:パスワードの正しさを確認する

register_user関数を変更して、ユーザーが同じパスワードを2回入力するようにします。入力しない場合、パスワードを再入力するように促す必要があります。このコードでは、次のようになります。

def register_user():first_name = input("Enter your first name: ")last_name = input("Enter your last name: ")email = input("Enter your email: ")while True:password1 = input("Enter your password: ")password2 = input("Confirm your password: ")# パスワードの正しさを確認するif password1 == password2:print("You have successfully registered!")breakelse:print("Your passwords must match")

この変更により、パスワードが一致しない限り、ユーザーは登録できません。

手順5:メールアドレスの一意性を確認する

ユーザーのテーブルを作成するSQLステートメントでは、emailフィールドを一意に定義しています。これは、ユーザーが既存のemailでサインアップすると、データベースがエラーを返すことを意味します。適切に対処するには、Pythonの例外を処理する必要があります。

def register_user():first_name = input("Enter your first name: ")last_name = input("Enter your last name: ")while True:email = input("Enter your email: ")password1 = input("Enter your password: ")password2 = input("Confirm your password: ")# パスワードの正しさを確認するif password1 == password2:try:print("You have successfully created an account.")breakexcept sqlite3.IntegrityError:print("Error: This email is already registered.")else:print("Your passwords must match.")

このコードは、try-exceptブロックを使用して、重複したemailから発生するエラーを処理します。データベースがIntegrityErrorをスローすると、whileループが継続し、ユーザーに別のemailアドレスを入力するように求めます。

このサンプルアプリでは、IntegrityErrorは重複したemailアドレスによってのみ発生すると想定しても問題ありません。実際のアプリでは、発生する可能性のある他の問題に対応するために、より高度なエラー処理を使用する必要があります。

手順6:ユーザーのデータをデータベースに挿入する

ユーザーのデータを収集して検証したので、データベースに追加します。これにはSQLクエリを使用できます。try-exceptブロックを次のように変更します。

try:cursor.execute("""INSERT INTO users (first_name, last_name, email, password)VALUES (?, ?, ?, ?)""", (first_name, last_name, email, password2))conn.commit()print("You have successfully created an account.")breakexcept sqlite3.IntegrityError:print("Error: This email is already registered.")

変更されたtry-exceptブロックでは、カーソルがSQL挿入操作を実行します。最後に、conn.commitメソッドがSQL操作をデータベースにコミットします。

上記の手順をすべて実行すると、ユーザーを登録してデータベースに保存するアプリケーションが完成します。DB Browser for SQLiteなどのアプリを使用して、データベースの内容を表示できます。

コレクション型ではなくデータベースを使用する

シンプルなデータベースの場合、独自のコードを記述する方が簡単かもしれません。ただし、アプリケーションが成長してデータベースが複雑になると、Django ORMなどのツールを使用してタスクを簡素化することを検討してください。

低レベルのデータベーススキルをさらに練習するには、登録プログラムを補完するログインシステムを実装してみてください。