2022-12-30 14:28:14

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 메소드를 사용하면 됩니다. 저는 이름을 기준으로 데이터를 찾아서 그 데이터를 삭제하게끔 했습니다.