データベース接続と操作関数
ユーティリティ関数は、データベース接続、URL の検証、ブラウザーとプラットフォームのカウンターの更新、および短縮 URL 用のランダムトークンの生成を担当します。
データベース接続
まず、pymysqlを使ってデータベース接続を設定します。これは、Flask アプリケーションが MySQL データベースとやり取りするために不可欠です。
utils.pyに、以下の Python コードを追加します。
from urllib.parse import urlparse
import random
import string
import pymysql
db_config = {
"host": "localhost",
"user": "root",
"password": "",
"db": "SHORTY"
}
def get_db_connection() -> pymysql.Connection:
"""Create and return a new database connection."""
return pymysql.connect(**db_config)
pymysqlライブラリは MySQL データベースに接続するために使用されます。このライブラリを使うと、Python アプリケーションが簡単な API を使って MySQL データベースとやり取りできます。
db_config辞書には、ホスト、ユーザー、パスワード、データベース名などのデータベース接続パラメータが含まれています。これらは、おそらくより良いセキュリティとモジュラリティのために別のconfigモジュールからインポートされています。設定を分離することで、メインコードベースを変更することなく簡単に調整できます。
get_db_connection()関数は、pymysql.connect(**db_config)関数を使ってデータベースに新しい接続を作成して返します。**db_config構文は、辞書をキーワード引数に展開するために使用されます。
データベース操作関数
データベース接続を確立した後、次のステップはデータベースで操作を行う関数を作成することです。これには、特定の短縮 URL のデータの一覧表示と、ブラウザーとプラットフォームの使用状況に基づくカウンターの更新が含まれます。
utils.pyに、以下の Python コードを追加します。
def list_data(shorty_url: str) -> tuple:
"""
Takes short_url for input.
Returns counter, browser, platform ticks.
"""
with get_db_connection() as conn, conn.cursor() as cursor:
su = [shorty_url]
info_sql = "SELECT URL, S_URL, TAG FROM WEB_URL WHERE S_URL = %s; "
counter_sql = "SELECT COUNTER FROM WEB_URL WHERE S_URL = %s; "
browser_sql = "SELECT CHROME, FIREFOX, SAFARI, OTHER_BROWSER FROM WEB_URL WHERE S_URL = %s;"
platform_sql = "SELECT ANDROID, IOS, WINDOWS, LINUX, MAC, OTHER_PLATFORM FROM WEB_URL WHERE S_URL = %s;"
cursor.execute(info_sql, su)
info_fetch = cursor.fetchone()
cursor.execute(counter_sql, su)
counter_fetch = cursor.fetchone()
cursor.execute(browser_sql, su)
browser_fetch = cursor.fetchone()
cursor.execute(platform_sql, su)
platform_fetch = cursor.fetchone()
return info_fetch, counter_fetch, browser_fetch, platform_fetch
def update_counters(cursor: pymysql.Connection, short_url: str, browser_dict: dict, platform_dict: dict) -> None:
"""Update browser and platform counters in the database for the given short_url."""
counter_sql = """UPDATE WEB_URL SET COUNTER = COUNTER + 1,
CHROME = CHROME + %s, FIREFOX = FIREFOX + %s, SAFARI = SAFARI + %s, OTHER_BROWSER = OTHER_BROWSER + %s,
ANDROID = ANDROID + %s, IOS = IOS + %s, WINDOWS = WINDOWS + %s, LINUX = LINUX + %s, MAC = MAC + %s, OTHER_PLATFORM = OTHER_PLATFORM + %s
WHERE S_URL = %s;"""
cursor.execute(counter_sql, (browser_dict['chrome'], browser_dict['firefox'], browser_dict['safari'], browser_dict['other'],
platform_dict['android'], platform_dict['iphone'], platform_dict[
'windows'], platform_dict['linux'], platform_dict['macos'], platform_dict['other'],
short_url))
list_data(shorty_url)関数は、特定の短縮 URL(shorty_url)に対してWEB_URLテーブルからさまざまな情報を取得するように設計されています。データベースに接続し、元の URL、関連するタグ、アクセスカウンター、ブラウザー、およびプラットフォームのアナリティクスを取得するために 4 つの SQL クエリを実行します。各クエリは個別に実行され、結果が取得されて返されます。
update_counters(cursor, short_url, browser_dict, platform_dict)関数は、データベース内の特定の短縮 URL のアクセスカウンター、ブラウザー、およびプラットフォームのカウントを更新します。この関数は、データベースカーソル、短縮 URL、および各ブラウザーとプラットフォームのカウントを含む 2 つの辞書を引数にとります。提供されたデータに基づいて短縮 URL のカウンターを増やすためのUPDATE SQL 文を構築します。この関数は、この関数を呼び出す前にブラウザーとプラットフォームの情報が決定されており、この情報が辞書(browser_dictとplatform_dict)として渡されることを前提としています。これらの辞書のキーは、WEB_URLテーブルの列に対応しています。
この設定は、Flask と MySQL を使った Web アプリケーションの典型的なパターンであり、共通のデータベース操作に対してユーティリティ関数が定義されています。これらの関数は、その後、アプリケーション全体でインポートして使用され、データベースとのやり取りを行い、メインアプリケーションロジックから直接的なデータベースアクセスと SQL クエリを抽象化します。