Pythonデータベース連携(input.py編)

現在未来電子テクノロジーにインターンさせてもらってプログラミングの勉強をしています。
今日、データベースを利用した入力フォームをPythonで作ることができましたので、そちらについて紹介していきたいと思います。
これからPythonを用いてデータベースを連携させたい人のために順を追って説明していきます。
なお、僕はプログラミング初心者ですので、内容に誤りがある場合があります。
その場合は指摘してくれるとうれしいです。まずは作りたい目標物を把握していきましょう。

以下の入力フォームを作ります

#1、input.pyファイル
:情報を入力してその入力値を次のファイルに持っていく

<img width="363" alt="スクリーンショット 2019-06-15 17.20.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276221/0009dfc8-6a8d-b21d-4858-1072372ff459.png">

このように入力できる欄があって、例えばこのように入力します。

<img width="358" alt="スクリーンショット 2019-06-15 17.25.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276221/3b3dab30-b468-8c99-413b-d3e5bb2b2e91.png">

#2、confirm.pyファイル
:入力した値が合っているか確認する

<img width="364" alt="スクリーンショット 2019-06-15 17.26.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276221/8c2fe2e7-a5f0-2c03-7cf4-ecfe01b792d9.png">

#3、complete.pyファイル
:入力した値が合っていたら登録完了と表示させる

<img width="359" alt="スクリーンショット 2019-06-15 17.27.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276221/e74bdffd-1e93-a7a0-f326-c2d384ceeef5.png">

#4、index.py
:入力した値を一覧で表示させる

<img width="364" alt="スクリーンショット 2019-06-15 17.28.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276221/ddb87c50-c852-9b69-73a2-364a57bb51d0.png">

このような一連の流れをデータベースを使って作っていきます！

1、input.pyファイルを作る

<img width="363" alt="スクリーンショット 2019-06-15 17.20.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276221/b6ded4d9-3a54-1b28-4b35-384c8a6e824a.png">

このようなフォームを作るためにはまずはHTML部分を作っていきましょう。

```
# 以下のコードを書かないと、htmlとして読み込んでもらえない。
print("Content-type: text/html; charset=utf-8")

print(

"""
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>学生入力フォーム</title>
</head>

<body>
    入力フォーム<br> <br>
    <form name="form" method="post" action="confirm.py">
      学籍番号:<br>
        <input type="number" name="number" placeholder="半角数字" required>＊必須項目<br> <br>
      名前:<br>
        <input type="text" name="name"  required>＊必須項目 <br> <br>
      年齢:<br>
        <input type="number" name="age" placeholder="半角数字" required>＊必須項目<br> <br>
      備考:<br>
        <textarea name="note" value=""></textarea>
        <br> <br>
      <input type="submit" value="確認">
    </form>
</body>
</html>
"""
)
```

まずは普通にHTMLで記述していきます。HTMLに関してはProgateで学ぶことができます。

formタグで送信部分を記述していきますがメソッドはPOSTメソッドにしましょう。メソッドとしてはGETメソッドもありますが、GETメソッドは渡せる情報量が少なく、URLを見ると渡した情報が分かってしまうので今回のように個人情報を扱う場合はPOSTメソッドの方が向いています。

inputのtypeをnumberにすることで入力できるのを数字に限定することができます。
また、未入力を防ぐためにinputタグの中にrequired属性を入れます。
そしてname属性を上からnumber、name、age、noteとすることでそれぞれをその要素名で扱えるようにできました。

さて、ここで確認しておきたいのが一番初めにprintとしていることです。このファイルはPythonファイル(.py)なので画面にhtml部分を出力するためにはprint()で出力する必要があるのです。僕も含めてプログラミング初心者の方にとってはPythonの文法を学んでいても使っている場面がイメージできないので学習サイトだけを利用していても進歩はありません。しかし、このように実際に制作物を作るときにインプットしたものをアウトプットする必要があるのでこれまでやってきたことに意味を与えます。

そして、これも大切なのですが、printでhtml部分を出力するためには(")で囲む必要があります。
しかし今回のように複数行をprintしたいときは(""")３つ使って囲むとできます。
すごく便利ですよね。

続いてデータベース部分を作って、入力した値を他のファイルにも反映させるようにしましょう。

```
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import sys
import io
import sqlite3
import cgi

# windowsにおける文字化け回避
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

# データベースに接続する
conn = sqlite3.connect('sample.db')
c = conn.cursor()

# テーブルの作成
c.execute('CREATE TABLE IF NOT EXISTS users (gakuseki integer, namae text, nennrei integer, bikou text);')

```
一番先頭の部分はコメントアウトしていますが無いとこのファイルが表示されなかったので(僕の場合)つけておきましょう。そして以下4つをimportしましょう。
データベースを扱うための言語であるSQLite3を今回は使用します。他にもMySQLなどがデータベース言語としてありますが、SQLiteのほうが簡易で使いやすいようです。

次にデータベースに接続するのですが、「conn = sqlite3.connect('sample.db')」の意味は分かりますか？これの中身は「コネクション名 = sqlite3.connect("データベース名")」ということです。
つまり、「データベース言語はsqliteでsample.dbというデータベースファイルを作りますよ。その一連の流れをconnというコネクション名が意味していますよ。」ということです。

次にデータベースを操作するときに使うカーソルを作成します。カーソルを使うことでデータベースの中にデータを入れたりすることができるので非常に重要です。Python3でカーソルを作るときには、「カーソル名 = コネクション名.cursor()」で作ります。今回僕は「c = conn.cursor()」にしました。先ほど作ったコネクション名のconnを使ってcというカーソル名のカーソルを作りました。コネクション名やカーソル名はなんでも良いのですがそれがどんな意味を示すか分かりやすいものにすると良いです。

そして、今回の山場、「テーブルの作成」です。デーブルとはデータベースの中で実際に値が格納される場所のことです。そのため入力した値をデータベースに入れて扱えるようにするにはこのテーブルの作成が必須になってくるのです。ちなみにテーブルはデータベースの中で何個も作れます。

SQL文を使ってテーブルを作っていきます。テーブルは「CREATE TABLE テーブル名(カラム名1, カラム名2, ...);」というように作ります。カラムとは列に相当するものです。実際に僕のコードで見ていきましょう。僕は「CREATE TABLE IF NOT EXISTS users (gakuseki integer, namae text, nennrei integer, bikou text);」というようにしました。これは「usersというテーブル名でカラムはgakusekiとnamaeとnennreiとbikouというテーブルを作りますよ。」と言う意味です。しかしそれらのカラム名の後ろにintegerやtextなどがくっついていますよね。これは「制約」といってそのカラムに入るデータを指定することができます。例えばintegerは符号付整数のみ許可すると言うことで、textはテキストのみ許可するということです。SQL文は最後に(;)が必要なのでつけ忘れないようにしてください。

ここで１つ疑問に思うことがあるでしょう。おそらく「IF NOT EXISTS」の部分です。これは「もしすでにそのテーブルが作られていたら作らないし、なかったら作りますよ。」と言う意味を表します。テーブルの重複を避け、必要な分だけ作れるので付けておきましょう。

これでテーブルを作れたので、入力した値を格納していくことができるようになりました。
また、printでhtmlを表示させるためにはprint("Content-type: text/html; charset=utf-8")という文がないとhtmlとして読み込まれないのでこれも記述しておきましょう。

これでinput.pyのファイルが完成です。次はconfirm.pyのファイルを解説します。