728x90
SQLAlechmy란?
- python에서 사용가능한 ORM
- ORM이란 말 그대로 객체와 관계를 연결해 주는 것 → MyBatis, JVM 같은 것
- 데이터베이스의 데이터를 ← 매핑 → Object
- 장점
- 객체 지향적인 코드로 비즈니스 로직에 집중 가능
- 재사용 및 유지보수 편리성 증가
- DBMS에 대한 종속성이 줄어듬
- 단점
- ORM 만으로는 서비스를 구현하기 어려움
- 프로시저가 많은 시스템에서는 장점을 가져가기 어려움
공식 사이트
SQLAlchemy - The Database Toolkit for Python
인스톨
pip install sqlalchemy
사용법
- DB를 사용하려면 create_engine 메소드로 DB 정의
- MySQL 사용 예시
from sqlachemy import create_engine
database_url = "mysql+pymysql://root:root@localhost:3306/study"
engine = create_engine(
database_url,
echo=True)
# DB 연결이 바로되는 건 아니고, 이제 메모리에 인식시키는 상황
# echo는 log에 실행되는 sql문을 찍어주는 것이다
- 테이블 생성
Base = declarative_base()
class BaseMixin:
id = Column(Integer, primary_key=True, index=True)
created_at = Column(DateTime, nullable=False, default=func.utc_timestamp())
updated_at = Column(DateTime, nullable=False, default=func.utc_timestamp(), onupdate=func.utc_timestamp())
class Users(Base, BaseMixin):
__tablename__ = "users"
status = Column(Enum("active", "deleted", "blocked"), default="active")
email = Column(String(length=255), nullable=True)
pw = Column(String(length=2000), nullable=True)
name = Column(String(length=255), nullable=True)
phone_number = Column(String(length=20), nullable=True, unique=True)
profile_img = Column(String(length=1000), nullable=True)
sns_type = Column(Enum("FB", "G", "K"), nullable=True)
marketing_agree = Column(Boolean, nullable=True, default=True)
# Users.__table__.create(bind=engine, checkfirst=True)
테이블 생성은 선언형을 Base로 하고, 클래스가 테이블을 의미하는 게 아니라, 클래스에 넣고 __tablename__
에 정의해야만 원하는 테이블명으로 매핑이 이루어진다.
코드 마지막 줄에 User.table.create가 있어야 실질적으로 생성이 되지만, 보통 테이블을 미리 세팅해놓고 작업을 진행하기에 코드에서는 사용하지 않았다.
생성한 DB에 데이터 처리를 하려면 session을 이용한다. DB와 대화하기 위한 절차이다.
비동기 처리를 위해 비동기 함수를 만들고 session을 Depend를 사용하였다.
from sqlalchemy.orm import Session
async def index(session:Session = Depends(db.session)):
user = Users(status='active', name='HelloWorld')
session.add(user)
session.commit()
# 매번 커밋을 입력하지 않고 만들 때 autocommit 옵션을 줄 수 있다
Users().create(session, auto_commit=True, name='서나')
사용하는 쿼리문
from sqlalchemy import select
from sqlalchemy.orm import Session
session = Session(engine, future=True)
# select * from table
query = session.select([table])
# 쿼리 실행
result_proxy = connection.excute(query)
result_set = result_proxy.fetchall()
# select * from where password='1234'
query = session.select([table]).where(table.columns.password=='1234')
query = session.query(User).filter(User.name == '서나')
# select * from where password is not null
query = session.select([table]).where(table.columns.password.isnot(none))
# insert into table values()
session.add(user1)
session.add_all([item1, item2, item3])
# delete from table where id=?
# delete는 개체를 삭제하면 갖고 있는 기본키에 대해 delete문 생성
session.delete(item1)
# 특정 where절에 대한 update 및 delete
session.query(User).filter(User.name == '서나').update({"name":"공주"}, synchronize_session="fetch")
session.query(User).filter('User.name == '서나').delete(synchronize_session="fetch")
synchronize_session = evaluate
→ 파이썬에 생성된 쿼리를 곧바로 평가해서 세션으로부터 제거되어야 할 객체를 결정. 기본값이고 효율적이지만 견고하지 않고, 복잡한 쿼리는 evaluate 될 수 없다.
synchronize_session = fetch
→ 삭제되기 전에 select 쿼리를 수행하고 해당 결과를 사용해서 어떤 객체들이 세션에서 삭제되어야할지 결정. 덜 효율적이지만 유효한 쿼리를 다룰 수 있다.
synchronize_session = False
→ 세션 갱신을 시도하지 않기 떄문에 매우 효율적이다. 그러나 삭제한 후에 세션을 사용하려고 하면 부정확한 결과를 얻을 수 있다.
728x90
'study > Python 🌼' 카테고리의 다른 글
[Python] 월 단위의 날짜 차이 계산 (0) | 2021.07.05 |
---|---|
[Python] Mac SSLCertVerificationError (0) | 2021.06.30 |
[Python] dataclass 모듈 사용법 (1) | 2021.05.28 |
[Python] 암호화를 하는 bcrypt (0) | 2021.05.28 |
[Python] classmethod vs staticmethod (0) | 2021.05.28 |