Repl.itで爆速でPython3+Flask+SQLite3のプログラムを動かしてみた

## ０．初めに

私はエンジニアではないただのドシロウトです。

Python3+Flask+SQLite3の環境が簡単に作れるRepl.itというオンラインIDEを試してみました。

Repl.it - The world's leading online coding platform
https://repl.it/

60以上のプログラム言語に対応したIDEみたいです。
無料で使えます。（非公開だと有料）

## １．使い方

あまりに簡単なので使い方をアニメGIFまとめました。

![anime gif](https://i.imgur.com/A4m0y6z.gif)

たったこれだけです。

ログインしなくても保存できないだけで試すことはできます。


## ２．コピペしたプログラム

すごく単純なFlaskを利用したプログラムです。

WEB画面から以下ができるプログラムです。

* データベースの生成
* テーブルの生成
* テーブル内容一覧表示
* データベースの削除


```python:main.py
from flask import Flask
import os
import sqlite3
import sys



app = Flask(__name__)


@app.route("/")
def index():
    #return "Hello World!"
    return '''
<h1>Flask SQLite3テスト</h1>
<a href="./readtasktb">タスク一覧</a><br>
<a href="./credb">DB生成</a><br>
<a href="./cretable">テーブル生成</a><br>
<a href="./deldb">DB削除</a><br>
    '''
@app.route("/credb")
def credb():

    kka = ""


    db_filename = 'todo.db'

    db_is_new = not os.path.exists(db_filename)

    conn = sqlite3.connect(db_filename)

    if db_is_new:
        print('Database created!!')
        kka = 'Database created!!'
    else:
        print('Database exists, assume schema does, too.')
        kka = 'Database exists, assume schema does, too.'
    conn.close()

    return kka + "<br><br><a href=\"../\">back</a>"

@app.route("/deldb")
def deldb():

    kka = ""
    db_filename = 'todo.db'
    try:
        os.remove(db_filename)
        kka = "Database deleted!!"
    except Exception as e:
        kka = "Database not deleted!! becouse of <br>"+str(e)    
    return kka + "<br><br><a href=\"../\">back</a>"


@app.route("/cretable")
def cretable():

    kka = ""

    db_filename = 'todo.db'

    with sqlite3.connect(db_filename) as conn:
        conn.executescript("""
            create table project (
                name        text primary key,
                description text,
                deadline    date
            );

            create table task (
                id           integer primary key autoincrement not null,
                priority     integer default 1,
                details      text,
                status       text,
                deadline     date,
                completed_on date,
                project      text not null references project(name)
            );
        """)

        print('Create schema')
        kka = kka + 'Creating schema<br>'

        conn.executescript("""
        insert into project (name, description, deadline)
        values ('pymotw', 'Python Module of the Week',
                '2016-11-01');

        insert into task (details, status, deadline, project)
        values ('write about select', 'done', '2016-04-25',
                'pymotw');

        insert into task (details, status, deadline, project)
        values ('write about random', 'waiting', '2016-08-22',
                'pymotw');

        insert into task (details, status, deadline, project)
        values ('write about sqlite3', 'active', '2017-07-31',
                'pymotw');
        """)

        print('Insert initial data')
        kka = kka + '<br>Insert initial data<br>'



    return kka + "<br><br><a href=\"../\">back</a>"


@app.route("/readtasktb")
def readtasktb():

    kka = ""
    db_filename = 'todo.db'

    try:
        with sqlite3.connect(db_filename) as conn:
            cursor = conn.cursor()

            cursor.execute("""
            select id, priority, details, status, deadline from task
            where project = 'pymotw'
            """)

            for row in cursor.fetchall():
                task_id, priority, details, status, deadline = row
                print('{:2d} [{:d}] {:<25} [{:<8}] ({})'.format(
                    task_id, priority, details, status, deadline))
                kka = kka + '{:2d} [{:d}] {:<25} [{:<8}] ({})'.format(
                    task_id, priority, details, status, deadline) + '<br>'
    except Exception as e:
        kka = "Task table list not generated!! becouse of <br>"+str(e)              
    return "task tb read result<br><br>" + kka + "<br><br><a href=\"../\">back</a>"



if __name__ == "__main__":
    app.run(debug=True, port='3000', host='0.0.0.0')


```

## ３．おわりに

プログラムが準備できていれば３０秒でPython3+Flask+SQLite3のテストができます。

なかなか便利だと思います。

以　上