Databases with SQLite and SQLAlchemy Included
SQLite
많이 사용되는 데이터베이스. 파이썬에 기본적으로 포함되어 있을 정도로 인기가 높음
cursor = db.cursor()
: 데이터베이스를 제어(마우스포인터)
엑셀이나 구글 시트에서 작업하는 경우 커서를 사용하여 데이터 행을 추가하거나 데이터를 편집/삭제하며, SQ 라이트 데이터베이스를 수정할 때도 커서가 필요
데이터베이스 표 만들기
cursor.execute("CREATE TABLE books (id INTEGER PRIMARY KEY, title varchar(250) NOT NULL UNIQUE, author varchar(250) NOT NULL, rating FLOAT NOT NULL)")
-
cursor
: 데이터베이스의 마우스 포인터로서 모든 작업을 수행 -
.execute()
: 커서가 작업을 실행하도록 명령. SQ 라이트 데이터베이스의 모든 작업은 구조화 질의어(SQL, Structured Query Language)라는 명령어로 표현되는데, 이는 키워드가 모두 대문자로 쓰인 영어 문장과 비슷함CREATE TABLE
: 데이터베이스에 새 표를 생성하는 키워드로 이 뒤에 표 이름이 오게 됨
books
: 생성 중인 새 표에 부여한 이름
()
: CREATE TABLE books ( ) 괄호 안에 들어가는 부분은 이 표의 필드, 또는 엑셀 시트의 열 제목
실행시
- SQL쿼리는 오타에 매우 민감함.
⇨ SQL알케미(SQLAlchemy)도구를 사용하여 파이썬 코드를 작성
SQLAlchemy
- 객체 관계형 매핑(ORM, Object Relational Mapping) 라이브러리
데이터베이스의 관계를 객체에 매핑할 수 있다
필드는 객체 속성이 되고,
표는 별도의 클래스,
데이터의 각 행은 새 개체로 정의
🛠️ from flask_sqlalchemy import SQLAlchemy
설치 후에도 빨간줄 떴을 때
터미널에
`pip uninstall Flask_SQLAlchemy`
`pip install Flask_SQLAlchemy`
예시
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
##CREATE DATABASE
app.config['SQLALCHEMY_DATABASE_URI'] = "sqlite:///new-books-collection.db"
# Optional: But it will silence the deprecation warning in the console.
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
##CREATE TABLE
class Book(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(250), unique=True, nullable=False)
author = db.Column(db.String(250), nullable=False)
rating = db.Column(db.Float, nullable=False)
# Optional: this will allow each book object to be identified by its title when printed.
def __repr__(self):
return f'<Book {self.title}>'
with app.app_context():
db.create_all()
# CREATE RECORD
new_book = Book(id=1, title="Harry Potter", author="J. K. Rowling", rating=9.3)
db.session.add(new_book)
db.session.commit()
SQLAlchemy를 사용한 CRUD작업
모든 레코드 읽기
all_books = session.query(Book).all()
쿼리별 특정 레코드 읽기
book = Book.query.filter_by(title="Harry Potter").first()
쿼리별 레코드 업데이트하기
book_to_update = Book.query.filter_by(title="Harry Potter").first()
book_to_update.title = "Harry Potter and the Chamber of Secrets"
db.session.commit()
기본키로 레코드 업데이트하기
book_id = 1
book_to_update = Book.query.get(book_id)
book_to_update.title = "Harry Potter and the Goblet of Fire"
db.session.commit()
기본키로 특정 레코드 삭제하기
book_id = 1
book_to_delete = Book.query.get(book_id)
db.session.delete(book_to_delete)
db.session.commit()
💡
with app.app_context():
db.create_all()