과제
ORM을 이용하여 SNS의 게시글 추가/수정/삭제 에 대한 로직을 완성하시오
초기화 및 설정
# 필요한 모듈 및 클래스 가져오기
from sqlalchemy import create_engine, MetaData
from sqlalchemy.schema import Table, Column, ForeignKey
from sqlalchemy.types import Integer, Text
from sqlalchemy.sql import select, insert, update, delete, join, func
from sqlalchemy.orm import declarative_base # ORM을 위한 기본 클래스
from sqlalchemy.orm import sessionmaker # 세션 관리를 위한 모듈
from sqlalchemy.orm import relationship # 관계를 정의하기 위한 모듈
# 데이터베이스 연결 설정
engine = create_engine('sqlite:///:memory:', echo=True) # SQLite 메모리 데이터베이스 생성
base = declarative_base() # 기본 클래스 설정
Session = sessionmaker(engine) # 세션 생성
sess = Session() # 세션 시작
데이터베이스 테이블 정의
class Post(base):
__tablename__ = 'POST'
pk = Column('PK', Integer, primary_key=True)
content = Column('CONTENCT', Text)
tags = relationship('Tags', back_populates='post', uselist=True)
def addTags(self, tags):
tagList = list()
for tag in tags:
rst = sess.query(Hashtag).filter(Hashtag.name == tag)
if rst.count() > 0:
tagList.append(rst.one())
else:
newTag = Hashtag(name=tag)
sess.add(newTag)
sess.commit()
tagList.append(newTag)
for tag in tagList:
sess.add(Tags(fk1=self.pk, fk2=tag.pk))
sess.commit()
tag.cnt += 1
def delTags(self, tags):
deltagList = list()
for tag in self.tags:
if tag.hashtag.name in tags:
deltagList.append(tag)
for tag in deltagList:
self.tags.remove(tag)
sess.delete(tag)
sess.commit()
tag.hashtag.cnt -= 1
sess.commit()
def __repr__(self):
return f'{self.pk}, {len(self.tags)}'
class Hashtag(base):
__tablename__ = 'HASHTAG'
pk = Column('PK', Integer, primary_key=True)
name = Column('NAME', Text)
cnt = Column('CNT', Integer, server_default='0')
posts = relationship('Tags', back_populates='hashtag', uselist=True)
def __repr__(self):
return f'{self.pk}, {self.name, len(self.posts)}'
class Tags(base):
__tablename__ = 'TAGS'
pk = Column('PK', Integer, primary_key=True)
fk1 = Column('FK1', None, ForeignKey('POST.PK'))
fk2 = Column('FK2', None, ForeignKey('HASHTAG.PK'))
post = relationship('Post', back_populates='tags')
hashtag = relationship('Hashtag', back_populates='posts')
# 테이블 생성
base.metadata.create_all(engine)