sqlalchemy는 ODM(object relational mapping)을 지원하는 파이썬 라이브러리입니다. MySQL과 같은 관계형 데이터베이스에 데이터를 입력하고, 조회하고, 수정하고, 삭제하려면 기본적으로 SQL이라는 언어를 알아야합니다. 하지만 ORM 라이브러리인 sqlalchemy를 사용하면 SQL없이도 DB를 조작할 수 있습니다. 이 글에서는 sqlalchemy를 사용하여 CRUD를 하는 방법에 대한 간단한 예제 코드를 소개해드리겠습니다.
from sqlalchemy import create_engine
from sqlalchemy import MetaData, Table, Column, Integer, String
engine = create_engine('sqlite:///test.db')
meta = MetaData()
users = Table(
'users', meta,
Column('id', Integer, primary_key=True),
Column('name', String),
Column('age', Integer),
)
meta.create_all(engine)
class CRUD:
@staticmethod
def insert(name, age):
query = users.insert().values(name=name, age=age)
conn = engine.connect()
conn.execute(query)
@staticmethod
def select_all():
query = users.select()
conn = engine.connect()
result = conn.execute(query)
for row in result:
print(row)
@staticmethod
def update_age(name, age):
query = users.update().where(users.c.name==name).values(age=age)
conn = engine.connect()
conn.execute(query)
@staticmethod
def delete(name):
query = users.delete().where(users.c.name==name)
conn = engine.connect()
conn.execute(query)
if __name__ == '__main__':
print("-----데이터 입력-----")
CRUD.insert('심교훈', 35)
CRUD.insert('문태호', 36)
CRUD.insert('황희', 33)
print("-----데이터 조회-----")
CRUD.select_all()
print("-----데이터 수정-----")
CRUD.update_age('심교훈', 31)
print("-----데이터 조회-----")
CRUD.select_all()
print("-----데이터 삭제-----")
CRUD.delete('심교훈')
print("-----데이터 조회-----")
CRUD.select_all()
CRUD 클래스 안에 @staticmethod라는 데코레이터가 붙어있는 여러 개의 메소드가 있는데, 비슷한 종류의 메소드들을 모아놓을 때 이런식으로 클래스를 만들어놓고 안에 넣어놓고 @staticmethod 데코레이터를 붙여서 정적 메소드로 만들어서 사용할 수 있습니다.
실행 결과는 다음과 같습니다. 데이터가 잘 입력되고, 조회되고, 수정되고, 삭제되었습니다. SQL 문법을 사용하지 않고 말이죠.
기능별로 코드 블럭을 나눠서 설명드리겠습니다.
1. DB 및 테이블 생성
보통 우리가 DB와 테이블을 생성할 때는 파이썬이 아닌 콘솔이나 MySQL Workbench와 같은 GUI 환경에서 SQL을 사용하여 생성합니다. 하지만 ORM을 활용하면 파이썬 코드로 DB 및 테이블을 생성할 수 있습니다.
engine = create_engine('sqlite:///test.db')
meta = MetaData()
users = Table(
'users', meta,
Column('id', Integer, primary_key=True),
Column('name', String),
Column('age', Integer),
)
meta.create_all(engine)
sqlite 데이터베이스에 id, name, age 컬럼이 있는 users 라는 이름의 테이블을 생성했습니다.
2. 데이터 입력
def insert(name, age):
query = users.insert().values(name=name, age=age)
conn = engine.connect()
conn.execute(query)
users 테이블에 데이터를 입력하고 싶을 때는 insert 메소드를 사용하면 됩니다.
3. 데이터 조회
def select_all():
query = users.select()
conn = engine.connect()
result = conn.execute(query)
for row in result:
print(row)
users 테이블에 있는 데이터를 조회하고 싶을 때는 select 메소드를 사용하면 됩니다.
4. 데이터 수정
def update_age(name, age):
query = users.update().where(users.c.name==name).values(age=age)
conn = engine.connect()
conn.execute(query)
users 테이블에 있는 데이터를 수정하고 싶을 떄는 update 메소드를 사용하면 됩니다. 저는 이름을 기준으로 데이터를 찾아서 나이값을 수정하도록 코드를 작성했습니다.
5. 데이터 삭제
def delete(name):
query = users.delete().where(users.c.name==name)
conn = engine.connect()
conn.execute(query)
users 테이블에 있는 데이터를 삭제하고 싶을 떄는 delete 메소드를 사용하면 됩니다. 저는 이름을 기준으로 데이터를 찾아서 그 데이터를 삭제하게끔 했습니다.
'Dev > python' 카테고리의 다른 글
[python] 문자열에서 한 자리 이상의 숫자들 추출하여 리스트로 만들기(정규식) (0) | 2023.01.06 |
---|---|
[python] 가상환경 virtualenv 사용 방법 (venv와 비교) (0) | 2023.01.06 |
[python] Pydantic 이해하기 (data class보다 더 나은 듯?) (0) | 2023.01.04 |
[python] 패키지 관리자 poetry의 pyproject.toml과 poetry.lock (2) | 2023.01.03 |
[python] pip install 중에 Warning: Retrying ... NewConnectionError와 같은 메시지가 뜨는 이유 (0) | 2022.11.17 |
[python] sklearn.metrics.f1_score로 F1 점수 구할 때 라벨이 1이 아닐 때 생기는 오류 해결법 (0) | 2022.11.15 |
[python] k-means 알고리즘으로 도매업 고객사 분류하기 (0) | 2022.11.14 |
[python] 의사결정 나무(decision tree)로 유방암 진단하기 (0) | 2022.11.13 |