Python – SQLAlchemy

By | 2024년 10월 27일
Table of Contents

Python – SQLAlchemy

CRUD 의 시점을 session.commit() 이 호출되는 시점으로 최대한 미루기때문에,
데이타베이스 접속을 최소화할 수 있습니다.

다만, session.commit() 을 누락하면 당연히 롤백됩니다.

테이블 생성

CREATE TABLE `user` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `username` VARCHAR(256) NOT NULL DEFAULT '0' COLLATE 'utf8mb4_general_ci',
    `email` VARCHAR(256) NOT NULL DEFAULT '0' COLLATE 'utf8mb4_general_ci',
    PRIMARY KEY (`id`) USING BTREE
)
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB
;

VSCode 에서 session 에 대한 자동완성이 필요하면 Pylance 를 설치해야 합니다.
설치 후 VSCode 를 재실행해야 합니다.

from __future__ import annotations

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, declarative_base
from sqlalchemy import Column, Integer, String, DateTime, Boolean

engine = create_engine('mysql+mysqldb://root:12345678@localhost:3306/testdb')
Session = sessionmaker(engine)
session = Session()

Base = declarative_base()

class User(Base):
    __tablename__ = 'user'
    id = Column(Integer, primary_key=True)
    username = Column(String)
    email = Column(String)
    # time = Column(DateTime, default=datetime.datetime.utcnow, primary_key=True)
    def __init__(self, user: User):
        # self.id = user.id
        self.username = user.username
        self.email = user.email
    def __init__(self, username: str, email: str):
        # self.id = user.id
        self.username = username
        self.email = email
    def update(self, user: User):
        self.username = user.username
        self.email = user.email

테스트 환경 구축

pip install sqlalchemy
pip install mysqlclient

insert

# insert
user = User(username="Lee", email="aaa@aaa.com")
session.add(user)
session.commit()

select

user: User 와 같이 타입을 명시해 주어야 자동완성이 작동합니다.

# select one
user: User = session.query(User).filter(User.username == "Lee").first()
# user: User = session.query(User).filter(User.username == "Lee 2", User.id == 2).first()
print(user.id)
# select all
users: List[User] = session.query(User).filter(User.username == "Lee").all()
# users: List[User] = session.query(User).filter(User.username == "Lee 2").order_by(User.id.desc()).all()
for user in users:
    print(user.id)

update

# update one
user2 = User(username="Lee 2", email="aaa2@aaa.com")
user: User = session.query(User).filter(User.username == "Lee").first()
user.update(user2)

# update list
user2 = User(username="Lee 2", email="aaa2@aaa.com")
users: List[User] = session.query(User).filter(User.username == "Lee").all()
for user in users:
    user.update(user2)

# 커밋을 할 때 자동으로 update 문이 실행된다.
session.commit()

delete

# delete
user: User = session.query(User).filter(User.id == 1).first()
if user is not None:
    session.delete(user)
session.commit()

답글 남기기