FLASK와 SQL
객체 관계 매핑을 가리키는 ORM을 이용할 것이다.
Flask-SQLAlchemy
pip install Flaks-SQLAlchemy
SQLite DB 생성 및 설정
import os
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
basedir = os.path.abspath(os.path.dirname(__file__))
# __file__ -> c:\Users\lee\Desktop\LEE\flask-practice\flask-sql
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///'+os.path.join(basedir, 'data.sqlite')
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
SQLALCHEMY_DATABASE_URI 값과 SQLALCHEMY_TRACK_MODIFICATIONS 값을 설정한다.
테이블 생성
class Puppy(db.Model):
# Manual Table Name Choice
__tablename__ = 'puppies'
id = db.Column(db.Integer, primary_key = True)
name = db.Column(db.Text)
age = db.Column(db.Integer)
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return f"puppy {self.name} is {self.age} year/s old"
# creat all the tables model -> db table
db.create_all()
sam = Puppy('Sammy', 3)
frank = Puppy('Frank', 4)
db.session.add_all([sam, frank])
# db.session.add(sam)
# db.session.add(frank)
db.session.commit()
CRUD
Create
# CREATE
my_puppy = Puppy('Rufus', 5)
db.session.add(my_puppy)
db.session.commit()
Read
all_puppies = Puppy.query.all()
print(all_puppies)
# [puppy Sammy is 3 year/s old, puppy Frank is 4 year/s old, puppy Rufus is 5 year/s old]
Update
# Update
first_puppy = Puppy.query.get(1)
first_puppy.age = 10
db.session.add(first_puppy)
db.session.commit()
Delete
# Delete
second_pup = Puppy.query.get(2)
db.session.delete(second_pup)
db.session.commit()
Migrate
from flask_migrate import Migrate
Migrate(app, db)
set FLASK_APP=basic.py
flask db init
flask db migrate -m "test"
INFO [alembic.runtime.migration] Context impl SQLiteImpl.
INFO [alembic.runtime.migration] Will assume non-transactional DDL.
INFO [alembic.env] No changes in schema detected.
flask db upgrade
INFO [alembic.runtime.migration] Context impl SQLiteImpl.
INFO [alembic.runtime.migration] Will assume non-transactional DDL.
Relationship
Flask와 SQLAlchemy를 사용하여 데이터베이스 모델 간의 관계를 정의하는 예제
클래스는 데이터베이스 테이블과 연결되며, 클래스 간의 관계를 표현하기 위해 SQLAlchemy의 관계 기능을 사용하였다.
Puppy 클래스
- toys: 강아지와 장난감 간의 일대다 관계를 표현하는 데 사용된다.
Toy 클래스와의 관계를 설정하고, backref를 사용하여 장난감에서 강아지로 역참조 할 수 있도록 합니다. - owner: 강아지와 주인 간의 일대일 관계를 표현하는 데 사용된다.
Owner 클래스와의 관계를 설정하고, uselist=False를 통해 리스트 대신 단일 객체를 사용하도록 설정합니다.
class Puppy(db.Model):
__tablename__ = 'puppies'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.Test)
# One to Many
toys = db.relationship('Toy', backref='puppy', lazy = 'dynamic')
# one to one
owner = db.relationship('Owner', backref='puppy', uselist=False)
def __init__(self, name):
self.name = name
def __repr__(self):
if self.onwer:
return f"Puppy name is {self.name} and owner is {self.owner.name}"
else:
return f"Puppy name is {self.name} and has no owner yet."
def report_toys(self):
print("Here are my toys: ")
for toy in self.toys:
print(toy.item_name)
Toy 클래스
class Toy(db.Model):
__tablename__ = "toys"
id = db.Column(db.Integer, primary_key=True)
item_name = db.Column(db.Text)
puppy_id = db.Column(db.Integer, db.ForeignKey('puppies.id'))
def __init__(self, item_name, puppy_id):
self.item_name = item_name
self.puppy_id = puppy_id
- puppy_id : 강아지와 장난감 간의 관계를 표현하기 위한 외래키로, 어떤 강아지에 속한 장난감인지를 나타낸다.
Owner 클래스
class Owner(db.Model):
__tablename__ = 'owners'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.Text)
puppy_id = db.Colum(db.Integer, db.ForeignKey('puppies.id'))
def __init__(self, name, puppy_id):
self.name = name
self.puppy_id = puppy_id
- puppy_id : 강아지와 장난감 간의 관계를 표현하기 위한 외래키로, 어떤 강아지에 속한 장난감인지를 나타낸다.