Python

flask)직접 신청폼 만들기-1 / flask-sqlite3 연결하기

summerorange 2023. 7. 30. 23:58
반응형

8월 달엔 한 번 해보고 싶은 원데이클래스 - 직접 개발 스티커 만들어보기! 모임을 해보려고 합니다.., 그런데 신청폼을 직접 flask로 만들어서 받아보려고 합니다.

구글 신청폼이나 노션 등등 많이 있지만, 직접 만들어서 쓰는 걸로... 이유는? 직접 만드는 게 더 기억에 남을 것 같습니다.

예상 기획 Draft는 다음과 같습니다. ㄱㅣ획은 그림그리듯 손으로...

home 이나 index.html 에는 3가지 html을 연결할 겁니다.

1 Register 폼이 있는 등록 페이지,

2 신청 인원을 볼 수 있는 명단 페이지,

3 온라인 갤러리 페이지.

하지만 갤러리까지 만드는 건 시간 없을 것 같아서 갤러리는 노션 링크를 붙여넣기로 했습니다.

여기에 추가로 전반적으로 관리가 되는 관리자 페이지는 보이지 않게 처리하려고 만드는 중입니다. 개별 사용자가 자신의 데이터를 수정하고 삭제하는 것 뿐만 아니라, 관리자가 따로 CRUD 가 다 되도록 처리할 예정입니다. 아직 만드는 중인데 후다닥 만들어야 8월에는 모임 개설을 할 수 있을 것 같네요

그래서 sqlite3 로 table을 만들었습니다. 


Sqlite3 -flask 만들기

1. 우선 TABLE 구조를 짭니다

스키마.sql은 대략 다음과 같이 id 로 서로 테이블을 연결해 주도록 primary key를 지정하였고, 성함, 닉네임, 이메일, 해당 정보를 수정할 수 있도록 비밀번호 지정까지 정해줍니다.

# schema.sql
CREATE TABLE Student (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL,
    nickname TEXT NOT NULL,
    email TEXT UNIQUE NOT NULL,
    password TEXT NOT NULL
);

CREATE TABLE Timeslot (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    date DATE NOT NULL,
    start_time TIME NOT NULL,
    end_time TIME NOT NULL,
    student_id INTEGER,
    FOREIGN KEY(student_id) REFERENCES Student(id)
);

이 테이블은 등록 인원, 해당 인원이 가능한 날짜, 해당 날짜에서 가능한 시작 시간, 가능한 마지막 시간 을 지정하고 테이블로 저장하는 형태입니다.

2. DB 이름 및 테스트 데이터 집어넣기

에디터를 키고 다음과 같이 sqlite3 과 관련해서 코드를 짭니다. database.db 라는 이름에 해당 스키마로 테이블을 만들고 이름, 별명, 메일주소, 비밀번호 예시 데이터를 집어넣었습니다.

vim initial_db.py
# initial_db.py
import sqlite3

connection = sqlite3.connect('database.db')


with open('schema.sql') as f:
    connection.executescript(f.read())

cur = connection.cursor()

# Insert student records
cur.execute("INSERT INTO Student (name, nickname, email, password) VALUES (?, ?, ?, ?)",
            ('문제가있으면연락주세요', 'if U have Any Problem...', 'testingDD@email.com', 'password1'))


# Get the IDs of the students we just inserted
student1_id = cur.execute("SELECT id FROM Student WHERE email = ?", ('testingDD@email.com',)).fetchone()[0]

# Insert timeslot records
cur.execute("INSERT INTO Timeslot (date, start_time, end_time, student_id) VALUES (?, ?, ?, ?)",
            ('2023-08-12', '10:00', '12:00', student1_id))

cur.execute("INSERT INTO Timeslot (date, start_time, end_time, student_id) VALUES (?, ?, ?, ?)",
            ('2023-08-13', '11:00', '13:00', student1_id))


# Commit changes
connection.commit()
connection.close()

DB이름과 test할 수 있도록 데이터를 집어넣고 실행시킬 겁니다.

python initial_db.py

으로 만들면 database.db가 생성됩니다.

이제 가지고 와서 읽고, 쓰고, 수정하고, 삭제하면 됩니다.

3. DB 연결 - CRUD 예시

해당 데이터를 어떻게 create, read, update, delete 할 수 있는지에 대한 예시입니다. 해당 코드는 적절하게 섞어서 사용할 예정입니다.

def connect_db():
    return sqlite3.connect('database.db')
# Create database connection
connection = connect_db()
cur = connection.cursor()

# Insert 예시
cur.execute("INSERT INTO Student (name, nickname, email, password) VALUES (?, ?, ?, ?)",
            (name, nickname, email, password))
# Insert timeslots
for date, start_time, end_time in zip(date_list, starttime_list, endtime_list):
    cur.execute("INSERT INTO Timeslot (date, start_time, end_time, student_id) VALUES (?, ?, ?, ?)",
                (date, start_time, end_time, student_id))
                
# SELECT 예시
cur.execute("SELECT * FROM Student WHERE id=?", (id,))
cur.execute("SELECT * FROM Student")
# 가지고 오기
users = cur.fetchall()

# Update user information 예시
cur.execute("""
    UPDATE Student SET name=?, nickname=?, email=? WHERE id=?
""", (name, nickname, email, id))

# DELETE 예시
cur.execute("DELETE FROM Timeslot WHERE student_id=?", (id,))
cur.execute("DELETE FROM Student WHERE id=?", (id,))

# Commit changes and close connection 하기
connection.commit()
connection.close()

심플 is best 디자인

이런 식으로 만드는 중입니다. 같이 원데이 클래스 - 스티커 만드실 분 모집하려고 합니다. 8월 초까진 후다닥 만드는 걸로!

반응형