Python-데이베이스 연동

🌱 학습한 내용

✏️데이터베이스 만들기

Glitch에서 sever.py 페이지>터미널 클릭
1. sqlite3 입력 엔터
2. .open db sqlite3 입력 엔터(이제 모든 명령이 db.sqlite3에 저장된다)
3. 표 만들기 ➪ CREAT TABLE topics ( 입력
4. id INTEGER PRIMARY KEY, 입력
5. title TEXT NOT NULL, 입력
6. body TEXT
7. )
8. ; 입력 후 엔터

이렇게 하면 성공

확인 방법
.tables 입력 엔터 했을 때 topics가 출력되면 OK.
Creata문 확인 ➪ .schema topics 입력 엔터

✏️데이터베이스에 데이터 입력

INSERT INTO topics (id,title,body) VALUE('SQLite', 'SQLite is...'); 엔터

id는 생략해도 된다. INTEGER PRIMARY KEY이기 때문에 자동으로 1씩 증가하기 때문에.

✏️추가한 데이터를 확인

데이터를 읽을 때는 데이터를 선택한다는 의미로 SELECT 사용
SELECT * FROM topics; 입력 후 엔터
우리가 입력한 데이터가 나온다.

  • 나가기 ➪ .exit
  • ls -l ➪ 파일 상세보기
    db.sqlite3 파일 안에 우리가 만든 데이터가 들어가있다.

✏️Python으로 SQLite 사용법

데이터 읽기
Glitch에서 새 파일 생성>read.py

import sqlite3
conn = sqlite3.connect('db.sqlite3')
curor = conn.cursor()
curor.execute('SELECT * FROM topics')
topics = curor.fetchall()
for topic in topics:
  print(topic[0], topic[1])
conn.close()
  • import sqlite3 ➪ Python에 sqlite3가 내장되어 있어 실행 가능
  • sqlite3.connect('db.sqlite3') ➪ sqlite3에 'db.sqlite3'로connect해라
    sqlite3.connect('db.sqlite3')에 이름을 붙일 것.
  • conn = sqlite3.connect('db.sqlite3') ➪ sqlite3.connect('db.sqlite3') 이 파일 이름은 conn이야.
  • cursor ➪ 커서가 움직이면서 내가 읽고 있는 데이터 위치를 파악한다는 은유
  • cursor = conn.corsor() ➪ conn.corsor()의 이름은 cursor이다.
  • curor.execute('SELECT * FROM topics') ➪ 데이커를 가져오고 topics 첫번째 정보에 커서를 가져다 놓은 상황
    커서를 움직여가면서 데이터를 읽을 수 있다.
  • fetchall ➪ 첫번째 행 부터 나머지 정보를 모두 가져와라(fetch)
  • for topic in topics: ➪ 리스트 안에 들어있는 각각의 데이터 가져오기

데이터 추가하기
read.py 파일 복제>create.py이름 변경

import sqlite3
conn = sqlite3.connect('db.sqlite3')
curor = conn.cursor()
title = input('title? ')
body = input('body? ')
curor.execute('INSERT INTO topics (title, body) VALUES(?, ?)', (title, body))
conn.commit()
conn.close()

import read
  • title = input('title? ') ➪ 타이틀은 타이틀 입력값
  • body = input('body? ') ➪ 바디는 바디 입력값
  • cursor.execute('INSERT INTO topics (title, body) VALUES(?, ?)') ➪ 입력 데이터는INSERT topics(title, body) 가치는 빈칸

타이틀에 사용자가 입력한 데이터가 corsor.execute 마지막 괄호 안 title로 가고 그게 VALUES 첫번째 물음표에 들어가. 바디도 동일 경로

코드와 보안에 도움이 된다.
생성, 수정, 삭제 작업을 하면

  • conn.commit() ➪ 생성, 수정, 삭제 작업을 한다면 입력
  • conn.close() ➪ 연결 닫기
  • import read ➪ 생성이 끝나고 read 코드가 실행

✏️웹페이지와 데이터베이스 연동

sever.py 페이지에 import sqlite3 입력

conn = sqlite3.connect('db.sqlite3')
  cs = conn.cursor()
  cs.execute('SELECT * FROM topics')
  topics = cs.fetchall()
  conn.close()
  print('topics',topics)
  liTags = ''
  for topic in topics:
    liTags = liTags + f'<li><a href ="/read/{topic[0]}/">{topic[1]}</a></li>'

db.sqlite3를 읽어서 이 데이터로 글 목록을 만들기

  • conn = sqlite3.connect('db.sqlite3') ➪ 연결시켜
  • cs = conn.cursor() ➪ cs는 커서야
  • cs.execute('SELECT * FROM topics') ➪ 커서실행은 topics에서 행과 컬럼을 가져와
  • topics = cs.fetchall() ➪ topics란? 데이터베이스 가져와서 Python화 시켜 가져오는거야
  • conn.close() ➪ 연결 닫기
    리스트 안에 데이터가 있는 것은 튜플
    튜플은 리스트와 같지만 수정이 안됀다. 0번째값~ 기능을 똑같이 가진다. id는 0, title은 1번째 값을 가짐.
    딕셔너리가 아니기 때문에 index를 적어주는 것이다.

상세보기 데이터 연결

@app.route("/read/<int:id>/") 
def read(id):
  conn = sqlite3.connect('db.sqlite3')
  cs = conn.cursor()
  cs.execute('SELECT * FROM topics WHERE id=?', (id,))
  topic = cs.fetchone()

  conn.close()
  title = topic[1]
  body = topic[2]
  return template(f'<h2>{title}</h2>{body}', id)
  • cs.execute('SELECT * FROM topics WHERE id=?', (id,)) ➪ id 입력값에 해당하는 곳의 정보 실행
  • topic = cs.fetchone() ➪ 우리가 가져온 데이터 1건 경우 사용

데이터베이스 쓰기 기능 연결

@app.route('/create_process/', methods=['POST'])
def create_process():
  title = request.form['title']
  body = request.form['body']
  conn = sqlite3.connect('db.sqlite3')
  cs = conn.cursor()
  cs.execute('INSERT INTO topics (title, body) VALUES(?,?)',(title,body))
  id = cs.lastrowid
  conn.commit()
  conn.close()
  return redirect(f'/read/{id}/')
  • cs.execute('INSERT INTO topics (title, body) VALUES(?,?)',(title,body)) ➪ 추가하려는 데이터는 title, body이고 값은 빈칸인데, 튜플(title,body)값이 들어올꺼야
    -conn.commit() ➪ connect에 comit, write 대기상태
  • id = cs.lastrowid ➪ 추가한 행의 id 값을 모른다. id는 가장 마지막 행의 id 값이야

데이터베이스 삭제 기능 연결

@app.route('/delete/<int:id>/', methods=['POST'])
def delete(id):
  conn = sqlite3.connect('db.sqlite3')
  cs = conn.cursor()
  cs.execute('DELETE FROM topics WHERE id = ?',(id,))
  conn.commit()
  conn.close()
  
  return redirect('/')
  • cs.execute('DELETE FROM topics WHERE id = ?',(id,)) ➪ topics delete 실행은 ?값 id에 해라. ?는 (id)값이다

삭제문에서 WHERE 빠르지말기!! 데이터 다 지워진다.

✏️ html 복습

      <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
      <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>
      <style>
      h1{{
        border-bottom:1px solid black;
        }}
        h1>a{{
          text-decoration:none;
        }}
      </style>
  • {{}} ➪ Python에서 html{}

부트스트랩 CSS, JavaScropt 코드 입력

버튼 변경, 합체

<form action="/delete/{id}/" method="POST">
        <div class="btn-group" role="group" aria-label="Basic example">
          <a href="/create/" class="btn btn-dark">create</a>
          {contextUI}
        </div>
      </form>


다크모드 버튼 생성

<body class="container">
      <input type="button" value="night" onclick="
      document.querySelector('body').style.backgroundColor = 'black';
      document.querySelector('body').style.color = 'white';
      ">

홈 페이지 삭제버튼 제외하기

 contextUI = ''
  if id != None:
    contextUI = '<input type="submit" value="delete" class="btn btn-dark">'
  • contextUI ➪ 임의로 설정한 이름

만약 id가 None랑 같지 않다면, delete버튼 내용인 contextUI를 실행해.

🍃 어려웠던 점 or 해결못한 것

  1. 터미널에서 데이터베이스를 파일을 생성하고 저장할 때 오타로 인해서 수정이 어려웠다. 중간에 놓쳐버리니 결과값이 다르게 나와서 헤맴
  2. 선생님이 말씀한 00이 아니라 00이네요의 의미를 알지 못함

🍀 해결방법 작성

✏️ 어떻게 해결을 했는가?
1. 질문으로 화면공유, 오타 확인과 선생님이 직접 확인해주셨다.
2. 강의를 다시 보면서 벨로그를 작성했고, 한문장 한문장 의미를 해석하며 정리하다보니 index값이 0과 1이 아니라 1과 2인 이유를 이해함
✏️ 이렇게 이해를 했다
✏️ 어디까지 이해했지?
데이터베이스 파일을 생성하고 확인하는 방법, 데이터베이스를 읽기, 데이터베이스에 새로운 데이터를 생성하고 확인하는 방법, Python에서 SQLite 목록, 생성, 삭제 정보 연동하기, 부트스트랩 사용해서 홈페이지 디자인
✏️ 다음에 시도해볼 방법
강의를 한문장 한문장 다시 들어보면서 반복해서 혼자 실습하기

🌷 학습 소감

매번 느끼지만 처음 듣는 정보를 들으려는 마음, 실습을 따라가는 손으로 급하게 임하니 오타가 많고 중간에 놓치는 부분이 있으며 이해가 되지 않는 것 같다. 오늘 새로운 접근으로 학습 내용을 정리해보니 내가 이해하지 못했던 부분과 코드 작성 이유가 조금씩 보이기 시작했다. 앞으로 강의를 천천히 곱씹으면서 이해와 익숙해지기 위해 반복하는 시간을 가져야겠다. 그리고 훨씬 효율적인 페이지가 작동되는 것을 보니 마음이 신난다.

좋은 웹페이지 즐겨찾기