安価なWeb開発勉強環境の構築②

**前回の内容**
[安価なWeb開発勉強環境の構築①](https://qiita.com/MasahiroShouya/items/6cd832c6eee0645055c3 "前回の記事")
上記リンク先にて、Raspberry PI のインストールからPython-Flaskを、
ApacheでWeb表示するまでの手順を掲載しています。

**今回の内容**
Web表示と言っても、データベースが無いと、勉強環境としては…
という事で、Postgresをセットアップして、Pythonで利用したいと思います。

**Postgresのセットアップ**
sudo apt-get install postgresql　（DB導入）
  sudo passwd postgres　（パスワード設定）
  sudo vi /etc/postgresql/15/main/pg_hba.conf　（パスワードで利用する為）
```diff_conf:pg_hba.conf
- local all all peer
+ local all all md5
```
  sudo vi /etc/postgresql/15/main/postgresql.conf
```diff_conf:postgresql.conf
- #listen_addresses = 'localhost'
+ listen_addresses = 'localhost'
```
sudo reboot　（再起動して設定変更を適用）
su - postgres　（ssh実行ユーザ切替）
createuser -P flask1　（DBアクセス用ユーザ登録）
psql
create database flask1;　（データベース作成）
alter database flask1 owner to flask1;　（データベースの権限付与）
\c flask1　（データベース切り替え）
\connect - flask1　（ユーザ切り替え）
```diff_sql:テスト用Table作成
 create table t_kbn (
    zkbn varchar(5),
    znum1 numeric(4,0), znum2 numeric(4,2),
    zstdate timestamp, zendate timestamp,
    val1 varchar(50), val2 varchar(50), val3 varchar(50),
primary key ( zkbn, znum1 ) );
```
```diff_sql:3件のテストデータ挿入
insert into t_kbn values ('A', 1, 1.2, '2024-9-2 12:34:56', now(), '', null, 'A');
insert into t_kbn values ('B', 1, 1.2, '2024-9-2 12:34:56', now(), '', null, 'A');
insert into t_kbn values ('C', 1, 1.2, '2024-9-2 12:34:56', now(), '', null, 'A');
```
**（※ postgresの作業終了）** <br>

source /flask/test1/venv/bin/activate　（仮想へ環境の準備）
pip install psycopg2-binary　（Postgresコネクター）
cd /flask/test1　（カレントの移動）
mkdir bin　（作業フォルダ作成）
vi test1.py　（プログラム作成）
```diff_python:test1.py
import psycopg2

conn = psycopg2.connect( database="flask1", user="flask1",
                password="★パスワード★", host="localhost", port="5432")

cur = conn.cursor()
sql = "SELECT * FROM t_kbn;"
cur.execute(sql)
rows = cur.fetchall()
for row in rows:
    print(row[0], row[1])
cur.close()
conn.close()
```
python3 test1.py　（プログラム実行）
これで挿入した３件のデータが表示されれば準備OKです。
deactivate　（仮想終了）

**SQL Alchemy**
【SQLに慣れている人が使うメリット】
　Postgresから別のDBに変える際、改修が少なく済む可能性があります
　　（開発標準であったり、プログラムの作り方次第の部分が大きいですが…）
【SQLに慣れてない人が使うメリット】
　SQLの御作法を知らなくても、データ操作するプログラムが構築できます
 
■■ 個人的な見解 ■■
Alchemy の利用により、ORMの抽象化によるオーバーヘッド分、処理速度の劣化がありそうです。複雑なSQLは、DBのQuery機能（View）に頼り、簡単なSQL利用で済む仕様に仕上げれば、大規模開発では、必要な技術と思われます。　（DB変更が容易になるのは大きいです）

source /flask/test1/venv/bin/activate　（仮想へ環境の準備）
pip3 install SQLAlchemy　（インストール）
cd /flask/test1/bin　（カレント変更）
vi db.py　（サブプログラム作成）
```diff_python:db.py
from sqlalchemy import create_engine, Column, Integer, String, DateTime, Float
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

engine = create_engine('postgresql://flask1:パスワード@localhost:5432/flask1')
Base = declarative_base()
Ses = sessionmaker(bind=engine)

class t_kbn(Base):
    __tablename__ = 't_kbn'
    zkbn = Column(String(5), primary_key=True)
    znum1 = Column(Integer, primary_key=True)
    znum2 = Column(Float)
    zstdate = Column(DateTime)
    zendate = Column(DateTime)
    val1 = Column(String(50))
    val2 = Column(String(50))
    val3 = Column(String(50))
```
vi test2.py　（実行プログラム作成、コメントアウト部はWhereのサンプルです）
```diff_python:test2.py
#from sqlalchemy.sql import operators
import db

with db.Ses() as session:
    # kbn = session.query(db.t_kbn).filter(operators.eq(db.t_kbn.zkbn, 'A')).all()
    kbn = session.query(db.t_kbn).all()
    for row in kbn:
        print(row.zkbn, row.znum1)
```
python3 test2.py　（プログラム実行）
これで挿入した３件のデータが表示されれば終了です。
お疲れさまでした～。