データベースとWebアプリケーション開発の基礎 概要: **データベース(DB)**は、組織的に管理されたデータの集合であり、データベース管理システム(DBMS)は、これを効率的に管理し、多数のユーザが同時に安全にアクセスできる環境を提供します。 学習目標: - データベースシステムの基本概念と重要性を理解する。 - データベース設計の理論と方法論を習得する。 - SQLを用いたデータベース操作のスキルを実践的に修得する。 - データベースアプリケーション開発の基礎知識を習得する。 学習方法: - SQLFiddleを活用したハンズオン実習。 - Replitを用いた統合開発環境での実装演習。 - オンライン教材による自主学習支援。 - アクティブラーニングによる課題解決型学習。 全体方針: - フロントエンド開発では、HTMLを用いてWebページの構造を定義し、セマンティックHTMLを使用してアクセシビリティを向上させる。 - バックエンド開発では、PythonのWebフレームワーク(Flask、Djangoなど)を使ってバックエンドロジックを構築し、SQLでデータベース操作を行う。 学習の流れ: - 基礎学習フェーズ:SQLとHTMLの基本を学ぶ。 - 実践学習フェーズ:SQL、Python、HTMLを用いて実践的な開発経験を積む。 - 応用開発フェーズ:FlaskやSQLiteを使って本格的なWebアプリケーション開発を行う。 各フェーズの詳細: - 基礎学習フェーズでは、SQLFiddleを使用して基本的なSQL操作やHTMLの基礎を学ぶ。 - 実践学習フェーズでは、Replitを使ってフロントエンドとバックエンドを統合し、データベースとの連携を実装する。 - 応用開発フェーズでは、FlaskとSQLiteでWebアプリケーションを構築し、セキュアな実装を行う。 フロントエンド開発 - HTMLを用いてWebページの構造を定義します.セマンティックHTML(意味的なマークアップ)を使用することで,ページの意味を明確にし,アクセシビリティ(利用のしやすさ)を向上させることができます. バックエンド開発 - Python:Webフレームワーク(Flask,Djangoなど)を用いてバックエンドロジックを構築します.これにより,サーバーサイドでのデータ処理やビジネスロジックの実装が可能です. - SQL:データベース操作を行います.データベース設計,クエリの作成,データの保存と取得などを学びます. 学習の流れ フロントエンドの基本 - HTMLを使用した静的なWebページの作成 - ページレイアウトの設計と実装 バックエンドロジックの構築 - Pythonを用いたユーザーリクエストの処理 - データベースとの連携機能の実装 データベースの統合 - SQLを用いたデータベース設計 - Pythonアプリケーションとの連携 - データの保存,更新,削除機能の実装 3つのフェーズで構成されています: 基礎学習フェーズ - 使用言語:SQL,HTML - 使用ツール:SQLFiddle(複数のDBMSに対応したオンラインSQLエディタ) - Replit(HTMLの基本学習用オンライン開発環境) - 目的:基本的なデータベースとWeb開発の概念理解 実践学習フェーズ - 使用言語:SQL,Python,HTML - 使用ツール:Replit(統合開発環境) - SQLite(データベース) - Flask(Webフレームワーク) - 目的:統合開発環境での実践的な開発経験 応用開発フェーズ - 使用言語:Python,SQL,HTML - 使用ツール:Flask(Webアプリケーションフレームワーク) - SQLite(データベース) - Replit(統合開発環境) - 目的:本格的なWebアプリケーション開発の実践 各フェーズは段階的に難易度が上がり,前のフェーズで学んだ内容を次のフェーズで活用する構成になっています. 各フェーズの詳細 1. 基礎学習フェーズ - SQLの基礎(SQLFiddle使用) - SQLFiddleは,MySQL,PostgreSQL,SQLiteなど複数のDBMS(データベース管理システム)を体験できるオンラインツールです.スキーマ設計からクエリ実行まで一貫した学習が可能で,実務に近い環境での学習を実現します. 学習内容とビジネスケース - 基本的なSELECT文:商品カタログからの商品検索,顧客情報の抽出 - WHERE句による絞り込み:売上データからの条件付き検索,在庫管理での閾値チェック - GROUP BY,HAVINGによる集計:月次売上レポート作成,顧客セグメント分析 - JOINによるテーブル結合:注文履歴と顧客情報の統合,商品カテゴリ別の販売分析 - サブクエリの活用:平均売上以上の商品抽出,ランキング機能の実装 - インデックスと最適化:大規模データでの検索速度改善,実行計画の分析と改善 Web開発の基礎(Replit使用) - Replitは,HTMLコードを即時実行可能なオンラインツールです.リアルタイムで結果を確認でき,コード共有機能を通じて学習コミュニティを活用できます. 学習内容 - HTMLの基本構造:セマンティックHTML,適切なタグの使用 - フォーム要素:データ入力フォームの実装,データ送信の基礎 - テーブル構造:データの表形式での表示手法 - アクセシビリティ:適切なマークアップ,ARIA属性の活用 2. 実践学習フェーズ - 統合開発環境(Replit使用) - Replitは,フロントエンドとバックエンドを含む開発が可能なオンライン環境です.データベースの利用やAIアシスタントによるサポート,チーム開発機能も搭載されています. 無料版の制限 - リソース使用量の制限 - アイドル時の自動停止 - 一定時間後のスリープモード 学習内容 - フォーム処理:バリデーション,エラーハンドリング - データベース連携:CRUD操作の実装,トランザクション管理 初級プロジェクト:Todoアプリケーション - CRUD操作の実装:タスクの追加,表示,更新,削除,データの永続化 - 基本的なデータベース操作:テーブル設計,インデックス設定,基本的なSQLクエリ 3. 応用開発フェーズ 開発環境 - Flask/SQLiteを用いた本格的なWebアプリケーション開発 - Replitを継続利用した統合開発環境 - バージョン管理との連携 学習内容 - Flaskアプリケーションの構造化 - データベース設計とSQLite操作 - セキュアなWebアプリケーション実装 基礎学習フェーズ → 第1-10回(データベース・SQL基礎) 実践学習フェーズ → 第11-13回(HTML・Flask・DB連携基礎) 応用開発フェーズ → 第14-15回(実践的DB連携) # 15回の授業内容 第1回:データベースの基本 - 概念・用語:データベース(DB)、データベース管理システム(DBMS) - 使用ツール:SQLite - トピックス:データベースの役割、データモデル - SQL例: ```sql CREATE TABLE products ( product_id INTEGER PRIMARY KEY, name TEXT, price INTEGER, stock INTEGER ); 第2回:リレーショナルデータベースとSQL入門 概念・用語:リレーショナルデータベース、SQL 使用ツール:SQLFiddle トピックス:リレーショナルデータベースの基本構造、基本的なSQL文法 SQL例: SELECT * FROM products; 第3回:データベース設計と正規化 概念・用語:データベース設計、正規化 使用ツール:SQLFiddle トピックス:データの冗長性削減、スキーマ設計 SQL例: CREATE TABLE customers ( customer_id INTEGER PRIMARY KEY, name TEXT, email TEXT ); データの重複を排除し、更新時の整合性を保つための第三正規形までの実装例です。 正規化前のテーブル CREATE TABLE orders_unnormalized ( order_id INTEGER PRIMARY KEY, customer_name TEXT, customer_email TEXT, product_name TEXT, product_price INTEGER, order_date DATE ); -- 正規化後のテーブル構造 CREATE TABLE customers ( customer_id INTEGER PRIMARY KEY, name TEXT, email TEXT ); CREATE TABLE products ( product_id INTEGER PRIMARY KEY, name TEXT, price INTEGER ); CREATE TABLE orders ( order_id INTEGER PRIMARY KEY, customer_id INTEGER, product_id INTEGER, order_date DATE, FOREIGN KEY (customer_id) REFERENCES customers(customer_id), FOREIGN KEY (product_id) REFERENCES products(product_id) ); 第4回:SQL入門:SQLFiddleによる実習 概念・用語:SQL,問い合わせ 使用ツール:SQLFiddle トピックス:情報取得方法、条件付き検索 SQL例: SELECT * FROM products WHERE price > 1000; 第5回:基本的なSELECT文 - 選択 概念・用語:SELECT文、WHERE句 使用ツール:SQLFiddle トピックス:情報取得方法、条件付き検索 SQL例: SELECT * FROM products WHERE price > 1000; SQL例: SELECT * FROM products WHERE price > 1000; 実務でよく使用される価格範囲検索、部分一致検索、複数条件での並び替えを組み合わせた実用的なクエリ例です。 -- 価格範囲による検索 SELECT * FROM products WHERE price BETWEEN 1000 AND 5000; -- 商品名による部分一致検索 SELECT * FROM products WHERE name LIKE '%デジタル%'; -- 在庫状況による並び替え SELECT * FROM products ORDER BY stock DESC, price ASC; 第6回:WHERE と INNER JOIN による結合 概念・用語:JOIN、在庫管理 使用ツール:SQLFiddle トピックス:複数テーブルの統合、顧客履歴の管理 SQL例: SELECT c.name, o.order_date FROM customers c JOIN orders o ON c.customer_id = o.customer_id; 複数テーブルを結合して注文の詳細情報を取得し、売上計算も行う実践的なクエリです。 -- 注文履歴の詳細表示 SELECT c.name AS customer_name, p.name AS product_name, o.order_date, p.price, o.quantity, (p.price * o.quantity) AS total_amount FROM orders o JOIN customers c ON o.customer_id = c.customer_id JOIN products p ON o.product_id = p.product_id WHERE o.order_date >= '2023-01-01'; 第7回:GROUP BY と HAVING による集計と分析 概念・用語:GROUP BY、HAVING句 使用ツール:SQLFiddle トピックス:データ集計、顧客セグメント分析 SQL例: SELECT customer_id, COUNT(order_id) as num_orders FROM orders GROUP BY customer_id HAVING num_orders > 5; 期間ごとの売上分析や商品カテゴリー別の顧客動向を把握するためのビジネス分析クエリです -- 月別売上集計 SELECT strftime('%Y-%m', order_date) AS month, COUNT(*) AS order_count, SUM(p.price * o.quantity) AS total_revenue, AVG(p.price * o.quantity) AS avg_order_value FROM orders o JOIN products p ON o.product_id = p.product_id GROUP BY strftime('%Y-%m', order_date) HAVING total_revenue > 1000000; -- カテゴリー別の販売分析 SELECT p.category, COUNT(DISTINCT o.customer_id) AS unique_customers, SUM(o.quantity) AS total_units_sold FROM products p LEFT JOIN orders o ON p.product_id = o.product_id GROUP BY p.category; 第8回:副問い合わせと論理演算子 概念・用語:サブクエリ、AND、OR、比較演算子 使用ツール:SQLFiddle トピックス:複雑なクエリの作成 SQL例: SELECT * FROM products WHERE price > (SELECT AVG(price) FROM products); 第9回:主キーと外部キーの設計 概念・用語:主キー、外部キー 使用ツール:SQLFiddle 第10回:HTML の基礎とフォーム 概念・用語:HTML、セマンティックHTML、フォーム、アクセシビリティ、ARIA属性 使用ツール:Replit トピックス:Webページの基本構造、静的ページ作成、データ入力フォーム、アクセシビリティ向上技法 HTML例: 商品一覧

商品一覧

HTML例:
アクセシブルなフォーム:AI-ARIAを活用し、スクリーンリーダー対応も考慮した完全なアクセシビリティを確保したフォームの実装例です。 Copy

注文フォーム

フルネームを入力してください
建物名・部屋番号まで記入してください
支払方法
第11回:Python と Flask 入門 概念・用語:Flask、Webフレームワーク 使用ツール:Replit, Flask トピックス:Webアプリケーションの基本構造、ルーティング、アプリケーション開発、フォームバリデーション Python例: from flask import Flask app = Flask(__name__) @app.route('/') def home(): return "Hello, Flask!" if __name__ == '__main__': app.run(debug=True) Python例: @app.route('/add_todo', methods=['POST']) def add_todo(): # タスクを追加するロジックを実装 return "Todo added" 第12回:データベース操作、Webとデータベースの連携 概念・用語:CRUD操作、データベース連携、フロントエンド、バックエンド、ユーザビリティ 使用ツール:Replit, Flask, SQLite トピックス:商品の登録と表示機能 Python例: from flask import Flask, render_template import sqlite3 app = Flask(__name__) @app.route('/products') def products(): conn = sqlite3.connect('database.db') cursor = conn.execute("SELECT * FROM products") products = cursor.fetchall() conn.close() return render_template('products.html', products=products) Flaskでのセキュアなデータベースアクセス:コネクションプールを適切に管理し、SQLインジェクション対策も実装したデータベースアクセスの基本パターンです。 from flask import Flask, request, render_template, g import sqlite3 from werkzeug.security import generate_password_hash, check_password_hash app = Flask(__name__) def get_db(): if 'db' not in g: g.db = sqlite3.connect('database.db') g.db.row_factory = sqlite3.Row return g.db @app.teardown_appcontext def close_db(error): if hasattr(g, 'db'): g.db.close() def init_db(): with app.app_context(): db = get_db() with app.open_resource('schema.sql', mode='r') as f: db.executescript(f.read()) db.commit() @app.route('/products', methods=['GET']) def list_products(): db = get_db() cursor = db.execute(""" SELECT p.*, c.name as category_name FROM products p JOIN categories c ON p.category_id = c.id WHERE p.stock > 0 ORDER BY p.name """) products = cursor.fetchall() return render_template('products.html', products=products) 第13回:データベースの更新と削除、トランザクション管理 概念・用語:トランザクション管理、データ操作 使用ツール:Replit, Flask, SQLite トピックス:商品の更新と削除、安全なデータ操作 Python例: @app.route('/update_product', methods=['POST']) def update_product(): conn = sqlite3.connect('database.db') conn.execute("UPDATE products SET name = ? WHERE id = ?", (new_name, product_id)) conn.commit() conn.close() return "Product updated" セキュリティ対策実装:コネクションプールを適切に管理し、SQLインジェクション対策も実装したデータベースアクセスの基本パターンです。 from flask import Flask, session from functools import wraps import secrets app = Flask(__name__) app.secret_key = secrets.token_hex(16) def login_required(f): @wraps(f) def decorated_function(*args, **kwargs): if 'user_id' not in session: return redirect(url_for('login')) return f(*args, **kwargs) return decorated_function @app.route('/admin/products', methods=['GET']) @login_required def admin_products(): # 管理者用の商品一覧表示 pass # CSRFトークンの生成と検証 def generate_csrf_token(): if 'csrf_token' not in session: session['csrf_token'] = secrets.token_hex(16) return session['csrf_token'] @app.route('/product/update', methods=['POST']) @login_required def update_product(): if request.form.get('csrf_token') != session['csrf_token']: abort(403) # 商品更新処理 pass 第14回:レポート機能の実装と総合演習 概念・用語:データ集計、視覚化 使用ツール:Replit, Flask, SQLite トピックス:アプリケーション開発、フォームバリデーション、売上レポート、総合演習 Python例: @app.route('/report') def report(): conn = sqlite3.connect('database.db') cursor = conn.execute("SELECT * FROM sales") sales_data = cursor.fetchall() conn.close() return render_template('report.html', sales=sales_data) Python例: @app.route('/add_todo', methods=['POST']) def add_todo(): # タスクを追加するロジックを実装 return "Todo added" レポート機能の実装:Pandasとmatplotlibを使用してデータベースから取得したデータを分析し、視覚化まで行う総合的なレポート機能の実装例です。 Copyfrom flask import Flask, render_template import pandas as pd import matplotlib.pyplot as plt from io import BytesIO import base64 @app.route('/sales-report') def sales_report(): db = get_db() # 売上データの取得 sales_data = pd.read_sql_query(""" SELECT strftime('%Y-%m', o.order_date) as month, p.category, SUM(o.quantity * p.price) as revenue, COUNT(DISTINCT o.customer_id) as unique_customers FROM orders o JOIN products p ON o.product_id = p.product_id GROUP BY month, p.category ORDER BY month """, db) # グラフの生成 plt.figure(figsize=(10, 6)) sales_data.pivot(index='month', columns='category', values='revenue').plot(kind='bar') plt.title('月別カテゴリー売上推移') plt.xlabel('月') plt.ylabel('売上(円)') # グラフの画像化 img = BytesIO() plt.savefig(img, format='png') img.seek(0) graph = base64.b64encode(img.getvalue()).decode() # 集計データの作成 summary = { 'total_revenue': sales_data['revenue'].sum(), 'avg_revenue_per_customer': sales_data['revenue'].sum() / sales_data['unique_customers'].sum(), 'top_category': sales_data.groupby('category')['revenue'].sum().idxmax() } return render_template( 'sales_report.html', graph=graph, summary=summary, sales_data=sales_data.to_dict('records') ) Todoアプリケーションの実装:RESTful APIの設計原則に従い、データベース操作とHTTPエンドポイントを効率的に実装した例です。 Copyfrom flask import Flask, request, jsonify from datetime import datetime app = Flask(__name__) class Todo: def __init__(self): self.db = get_db() self.create_tables() def create_tables(self): self.db.execute(""" CREATE TABLE IF NOT EXISTS todos ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, description TEXT, due_date DATE, priority INTEGER, status TEXT DEFAULT 'pending', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) """) self.db.commit() def add_todo(self, title, description, due_date, priority): self.db.execute(""" INSERT INTO todos (title, description, due_date, priority) VALUES (?, ?, ?, ?) """, (title, description, due_date, priority)) self.db.commit() def get_todos(self, status=None): query = "SELECT * FROM todos" if status: query += " WHERE status = ?" return self.db.execute(query, (status,)).fetchall() return self.db.execute(query).fetchall() @app.route('/api/todos', methods=['GET', 'POST']) def handle_todos(): todo = Todo() if request.method == 'POST': data = request.get_json() todo.add_todo( data['title'], data.get('description', ''), data.get('due_date'), data.get('priority', 1) ) return jsonify({'message': 'Todo created successfully'}), 201 else: status = request.args.get('status') todos = todo.get_todos(status) return jsonify(todos) 第15回:データベースシステムのまとめと展望 概念・用語:NoSQL、データウエアハウス 使用ツール:Replit, Flask, SQLite 第15回:レポート機能の実装と総合演習 概念・用語:データ集計、視覚化 使用ツール:Replit, Flask, SQLite トピックス:売上レポート、総合演習