4.1 데이터베이스와 SQLite

이재빈·2022년 4월 1일
0

AI스쿨

목록 보기
8/8

배운내용

sqlite와 파이썬 연결하기

https://docs.python.org/ko/3/library/sqlite3.html

imput된 title과body값을 values 뒤에 있는 title,body값으로 간 후 이 값이 value안의 ?,?로 간다. 그리고 topics에 추가된다.

import sqlite3
conn = sqlite3.connect('db.sqlite3') #conn이라는것을 정의
curor = conn.cursor()                #비유적인개념, 
title = input('title? ')
body = input('body? ')
curor.execute('INSERT INTO topics (title, body) VALUES(?, ?)', (title, body)) 
	#execute: 집행 ~해라 라고 하는것
conn.commit() #읽는것 뿐만 아니라 쓰기(변화)도 하기 때문에 필요(쓸 때 사용), create파일
for topic in topics:
  print(topic[0], topic[1]) #리스트형으로 순서(숫자)를 통해 출력(읽을때 사용), read파일
conn.close()

항상 끝에 close로 닫아줄 필요가 있음

패치 : 데이터베이스안의 파일을 파이썬으로 컨버팅(바꾸는 작업을 위해 필요)

topics = curor.fetchall() {}들로 이루어진[](리스트)로 가져옴
topics = curor.fetchone() 딕셔너리({},하나)를 가져옴

(id,) #튜플로 만들기 위해 ,를 무조건 넣는다.
그냥 (id)라고 하면 id라고 나옴

"{"의 용도가 이미 있기때문에, style태그의 {를 사용하기 위해 {{를 씀
('{'때문에 글리치에서 주석을 못담)

강사님의 권장사항
html은 네이티브상태로만들자
파이썬은 숫자데이터,문자데이터, 변수, 입력(input)은 알아야된다.

복기하는 내용

차이점

sqlite3 파일을 파이썬 파일에 연동? 하기 때문에

import sqlite3 구문필요
ex)

from flask import Flask, request, redirect
			import sqlite3

이 template를 정의하는 구문에서 sqlite와 연동해서 정의
liTag에서 "id"와"body"값을 0과 1로 바꿈
ul태그를 대체할 수 있음

def template(content, id=None):
  liTags = ''
  for topic in topics:
    liTags = liTags + f'<li><a href="/read/{topic["id"]}/">{topic["title"]}</a></li>'
  return f'''
def template(content, id=None):
  conn = sqlite3.connect('db.sqlite3')
  curor = conn.cursor()
  curor.execute('SELECT * FROM topics')
  topics = curor.fetchall()         #데이터베이스안의 파일을 파이썬으로 컨버팅(바꾸는 작업을 위해 필요)
  conn.close()
  liTags = ''
  for topic in topics:
    liTags = liTags + f'<li><a href="/read/{topic[0]}/">{topic[1]}</a></li>'
  return f'''
 <ul> #그냥 묶음 = 앞에 점붙음
        <li><a href="/create/">create</a></li>
        <li>
          <form action="/delete/{id}/" method="POST">
            <input type="submit" value="delete">
          </form>
        </li>
      </ul>

read (상세보기) 명령을 바꿀수 있음,
유의할점 : 튜플로 만들기 위해 ,를 무조건 넣는다. 그냥 (id)라고 하면 id라고 나옴

def read(id): #상세보기의 내용을 말함
  title = ''
  body = ''  
  for topic in topics :
    if topic['id'] == id:
      title = topic['title']
      body = topic['body']
      break;
  return template(f'<h2>{title}</h2>{body}', id)

을 /SELECT/

def read(id):           
  conn = sqlite3.connect('db.sqlite3')
  curor = conn.cursor()
  curor.execute('SELECT * FROM topics WHERE id=?', (id,))  
  topic = curor.fetchone()
  conn.close()
  title = topic[1]
  body = topic[2]
  return template(f'<h2>{title}</h2>{body}', id)

Create(생성) 페이지를 추가하기 위해 nextId라는 변수를 만들고, global로 내재화하고 topic가 하나씩 추가되면서 redirect를 하면 -1주소로 보내고 하는 일련의과정을

def create_process():
  global nextId
  title = request.form['title']
  body = request.form['body']
  newTopic = {"id":nextId, "title": title, "body": body}
  topics.append(newTopic)
  nextId = nextId + 1
  return redirect(f'/read/{nextId-1}/')

db.sqlite3 파일에 연결된 conn 변수를 통해 자동으로 추가생성을 하고
id = cursor.lastrowid 를 통해 새로은 행에 대한 값을 반환할수 있게해줌
nextId가 필요없기때문에 global,{nextID-1} 등이 필요없게 된다. /INSERT/

def create_process():
 title = request.form['title']
 body = request.form['body']
 conn = sqlite3.connect('db.sqlite3')
 curor = conn.cursor()
 curor.execute('INSERT INTO topics (title, body) VALUES(?,?)',(title,body))
 id = curor.lastrowid
 conn.commit()
 conn.close()
 return redirect(f'/read/{id}/')

delete 삭제
위의 차이들과 별차이가 없다.
페이지를 읽을 때 처럼' DELETE FROM TOPICS WHERE id=? ',(id,) 가 필요
페이지를 수정하는 작업을 하기 때문에 conn.commit() 구문 필요

페이지 꾸미기

 <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>

와 template에 contextUI에 대해 정의

contextUI = ''
if id != None:
  contextUI = '<input type="submit" value="delete" class="btn btn-dark">'

어려운 내용

관계망에 대해 아직 이해가 어렵다.
각 항목을 떼어놓고만 보면 이해가 되지만, 이것을 활용하기 위해서는 어떤쪽으로 공부해야될지 막막한 느낌이다.

해결방법

백지를 놓고 하나씩 항목을 비교해가면서 코딩해야겠다

profile
안뇽하세용

0개의 댓글