PythonのTkinterとSuica(NFC)で出退勤(その1-イントロダクションとDB)

2021年3月22日

こんにちは

Suicaを使って出退勤の打刻したいですよね。

え?今はリモートのご時世?Webで出勤ボタンぽちっとな?

いやいやまさか。

PythonのTkinterとPaSoRi(電気屋で3000円くらいで売ってるFeliCaを読み取る機器)を使って非常にシンプルな出退勤システムを作ります。

タッチパネル付きRaspberry Piで実装したかったんですが、タッチパネルの反応が悪くて断念、Windowsで実装します。

今回はシステムのイメージ図とSQLite3を使ったDB・テーブル作成をします。

※Pythonのversionは3.7.7です

■イメージ図(機能が3つあります)

1.FeliCa登録

2.打刻

3.FeliCaの一覧や打刻履歴の一覧の表示

これを目標に作ります

■DB(SQLite3)

SQLite3はPython標準で入っているので、別途インストールの必要はありません。

テーブルは2つ すごくシンプルですね

1.nfcテーブル

id
INTEGER
AUTOINCREMENT
idm
VARCHAR
unique
name
VARCHAR
NOT NULL

※idmはFeliCaを識別する一意のid

2.timecardテーブル

id
INTEGER
AUTOINCREMENT
idm
VARCHAR
NOT NUL
attendanceTime
DATE
NOT NULL
leaveWorkTime
DATE

外部キーがnfcテーブルのidm

テーブルを作りましょう

import os
import sqlite3

class CreateDatabase():
    current_dir = os.getcwd()
    print(os.getcwd() )
    print(current_dir)
    dbname = current_dir + '\database.db'
    conn = sqlite3.connect(dbname)
    # 外部キー制約の使用を有効にする
    conn.execute("PRAGMA foreign_keys = 1")

    try:
        # timecardテーブル(タイムカードテーブル)削除(テーブルを削除する場合はコメントを外す)
        # sql = "Drop Table timeCard"
        # conn.execute(sql)
        # nfcテーブル(ユーザーマスタ)削除(テーブルを削除する場合はコメントを外す)
        # sql = "Drop Table nfc"
        # conn.execute(sql)

        # nfcテーブル(ユーザーマスタ)作成
        sql = "CREATE TABLE nfc (id INTEGER PRIMARY KEY AUTOINCREMENT, idm VARCHAR(20) unique, name VARCHAR(40) NOT NULL);"
        conn.execute(sql)

        # timecardテーブル(タイムカードテーブル)作成
        sql = "CREATE TABLE timeCard (id INTEGER PRIMARY KEY AUTOINCREMENT, idm VARCHAR(20) NOT NULL, attendanceTime DATE NOT NULL, leaveWorkTime DATE, FOREIGN KEY(idm) REFERENCES nfc(idm));"
        conn.execute(sql)

        #テーブルの存在確認        
        sql = "select * from sqlite_master where type='table'"
        for t in conn.execute(sql):
            print(t)

    finally:
        conn.close()

def main():
    CreateDatabase()

if __name__ == "__main__":
    main()

まだ見れないけど、select文

import os
import sqlite3

class ReadDatabase():
    current_dir = os.getcwd()
    print(os.getcwd() )
    print(current_dir)
    dbname = current_dir + '\database.db'
    conn = sqlite3.connect(dbname)

    try:
        # nfcテーブル(ユーザーマスタ)レコードの確認
        sql = "select * from nfc"
        print('nfcテーブル')
        for t in conn.execute(sql):
            print(t)
        
        # timecardテーブル(タイムカードテーブル)レコードの確認
        sql = "select * from timeCard"
        print('timecardテーブル')
        for t in conn.execute(sql):
            print(t)
    finally:
        conn.close()

def main():
    ReadDatabase()


if __name__ == "__main__":
    main()

これでDBは終わり

次は管理画面(Felicaの登録・検索、打刻一覧)をつくりましょうか