📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

 
(同じ利用者による、間の2版が非表示)
167行目: 167行目:
<br>
<br>
データベースを作成する。<br>
データベースを作成する。<br>
  sudo -u postgres createdb myapi_db
  sudo -u postgres createdb   <任意のデータベース名>
  sudo -u postgres createuser myapi_user
  sudo -u postgres createuser <任意のデータベースユーザ名>
<br>
==== MariaDBを使用する場合 ====
===== MariaDBのインストール =====
MariaDBをインストールする。<br>
# RHEL
sudo dnf install
# SUSE
sudo zypper install
# Raspberry Pi
sudo apt install mariadb-server mariadb-client
<br>
MariaDBのセキュリティを設定する。<br>
* rootパスワードの設定
* anonymousユーザの削除
* リモートrootログインの禁止
* テストデータベースの削除
* 権限テーブルの再読み込み
<br>
sudo mysql_secure_installation
<br>
MariaDBへログインして、データベースの作成、ユーザの作成、権限の設定を行う。<br>
sudo mysql -u root -p
# データベースとユーザの作成
CREATE DATABASE <<任意のデータベース名>;
CREATE USER '<任意のデータベースユーザ名>'@'localhost' IDENTIFIED BY '<データベースユーザのパスワード>';
# 権限の設定
GRANT ALL PRIVILEGES ON <<任意のデータベース名>.* TO '<任意のデータベースユーザ名>'@'localhost';
# 設定を反映
FLUSH PRIVILEGES;
<br>
MariaDB向けPythonドライバをインストールする。<br>
pip install mysql-connector-python sqlalchemy mysqlclient
# または
pip3 install mysql-connector-python sqlalchemy mysqlclient
<br>
必要な場合は、MariaDBのパフォーマンスの最適化を行う。<br>
<syntaxhighlight lang="ini">
[mysqld]
# バッファプールサイズ (利用可能メモリの50-70[%]程度)
innodb_buffer_pool_size = 1G
# クエリキャッシュ
query_cache_type = 1
query_cache_size = 128M
# 接続数の設定
max_connections = 150
# スレッドキャッシュ
thread_cache_size = 8
# テーブルオープンキャッシュ
table_open_cache = 2000
# InnoDBの設定
innodb_file_per_table          = 1
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size        = 16M
</syntaxhighlight>
<br>
===== バックアップ設定 =====
バックアップスクリプトを作成する。<br>
<br>
<syntaxhighlight lang="sh">
#!/usr/bin/env sh
BACKUP_DIR="<任意のバックアップディレクトリ  例: /var/backups/mysql>"
BACKUP_FILE="<任意のバックアップファイル名  例: myapi_db>"
DATE=$(date +%Y%m%d_%H%M%S)                      # 日付を付加する場合
BACKUP_FILE="$BACKUP_DIR/$BACKUP_FILE_$DATE.sql"  # バックアップファイルのパス
# バックアップの作成
# 例: mysqldump -u myapi_user myapi_db > $BACKUP_FILE
mysqldump -u <データベースユーザ名> <データベース名> > $BACKUP_FILE
# 圧縮
gzip $BACKUP_FILE
# 30日以上前のバックアップを削除 (オプション)
find $BACKUP_DIR -name "*.sql.gz" -mtime +30 -delete
</syntaxhighlight>
<br>
===== MariaDBのメンテナンス =====
定期的な実行が推奨されるメンテナンスを行う。<br>
<br>
<syntaxhighlight lang="mysql">
-- テーブルの分析
ANALYZE TABLE items;
-- テーブルの最適化
OPTIMIZE TABLE items;
-- インデックスの使用状況確認
SHOW INDEX FROM items;
-- スロークエリの確認
SHOW VARIABLES LIKE '%slow%';
SHOW VARIABLES LIKE '%long%';
</syntaxhighlight>
<br><br>
<br><br>


== APIの基本的な実装 ==
== APIの基本的な実装 ==
==== Python + FastAPIを使用する場合 ====
==== Python + FastAPIを使用する場合 ====
以下に示すソースコードはサーバサイドであり、APIサーバ内部で動作する部分である。<br>
したがって、クライアントが直接触れる部分ではなく、APIサーバの内部実装として機能する。<br>
<br>
クライアントは以下に示すソースコードを意識することなく、定義されたAPIエンドポイントを通じてデータの操作を行うことが可能となる。<br>
<br>
===== PostgresSQLを使用する場合 =====
  <syntaxhighlight lang="python">
  <syntaxhighlight lang="python">
  # main.pyファイル
  # main.pyファイル
192行目: 302行目:
  async def create_item(item: Item):
  async def create_item(item: Item):
     return item
     return item
</syntaxhighlight>
<br>
===== MariaDBを使用する場合 =====
以下の例では、APIサーバがMariaDBと通信するための設定を行う。<br>
* データベースへの接続設定
* コネクションプールの管理
* セッション管理の設定
<br>
<syntaxhighlight lang="python">
# database.py
# SQLAlchemyを使用したデータベース接続設定
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
SQLALCHEMY_DATABASE_URL = "mysql+mysqlconnector://myapi_user:your_password@localhost/myapi_db"
engine = create_engine(
    SQLALCHEMY_DATABASE_URL,
    pool_size=5,
    max_overflow=10,
    pool_timeout=30,
    pool_recycle=1800
)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()
</syntaxhighlight>
<br>
以下の例では、データベースのテーブル構造をPythonのクラスとして定義している。<br>
* データベーステーブルの構造定義
* SQLAlchemyによるORMマッピング
* テーブルのカラム定義とその制約
<br>
<syntaxhighlight lang="python">
# models.py
# モデルの定義例
from sqlalchemy import Column, Integer, String, DateTime
from sqlalchemy.sql import func
from database import Base
class Item(Base):
    __tablename__ = "items"
    id = Column(Integer, primary_key=True, index=True)
    name = Column(String(100), nullable=False)
    description = Column(String(500))
    created_at = Column(DateTime(timezone=True), server_default=func.now())
    updated_at = Column(DateTime(timezone=True), onupdate=func.now())
</syntaxhighlight>
<br>
これらをREST APIサーバとして使用する場合、以下に示すような構成となる。<br>
<syntaxhighlight lang="python">
# main.py (APIエンドポイントの定義)
from fastapi import FastAPI, Depends
from sqlalchemy.orm import Session
from . import models, database
app = FastAPI()
# データベースセッションの依存性注入 (DIコンテナ)
def get_db():
    db = database.SessionLocal()
    try:
      yield db
    finally:
      db.close()
# APIエンドポイント例
@app.post("/items/")
def create_item(name: str, description: str, db: Session = Depends(get_db)):
    db_item = models.Item(name=name, description=description)
    db.add(db_item)
    db.commit()
    db.refresh(db_item)
    return db_item
</syntaxhighlight>
<br>
REST APIサーバの情報を取得する場合は、クライアントからREST APIエンドポイントに対してHTTPリクエストを送信する。<br>
<syntaxhighlight lang="sh">
# クライアントからのAPIリクエスト例
curl -X POST "http://your-server/items/" \
      -H "Content-Type: application/json" \
      -d '{"name": "テスト項目", "description": "説明文"}'
  </syntaxhighlight>
  </syntaxhighlight>
<br><br>
<br><br>


== HTTPS対応 ==
== HTTPS対応 ==
274行目: 472行目:
   
   
  sudo wget -q -O /usr/share/keyrings/grafana.key https://apt.grafana.com/gpg.key
  sudo wget -q -O /usr/share/keyrings/grafana.key https://apt.grafana.com/gpg.key
<br>
MariaDBを使用している場合は、MySQLエクスポータ (Prometheus向け) をインストールする。<br>
sudo apt install prometheus-mysqld-exporter
<br>
MySQLエクスポータ (Prometheus向け) の設定ファイルを作成する。<br>
sudo vi /etc/default/prometheus-mysqld-exporter
<br>
# /etc/default/prometheus-mysqld-exporterファイル
# 例: DATA_SOURCE_NAME="myapi_user:your_password@(localhost:3306)/"
DATA_SOURCE_NAME="<データベースユーザ名>:<データベースユーザのパスワード>@(localhost:<MariaDBのポート番号>)/"
<br><br>
<br><br>