2022-12-26 20:52:27

beanie는 MongoDB를 위한 파이썬의 비동기 ODM(object-document mapper)입니다. 오늘은 beanie를 활용하여 MongoDB에 CRUD를 하는 방법을 살펴보겠습니다. MongoDB는 설치되어 있다고 가정하고 진행하겠습니다. 그리고 아이디 root, 비밀번호 root인 루트 계정을 만들어서 사용하겠습니다. 

 

Create 데이터 삽입

from beanie import Document, Indexed, init_beanie
import asyncio


class Player(Document):
    name: Indexed(str)
    back_num: int

    class Settings:
        name = "Player"


async def initiate_database():
    await init_beanie(
        connection_string=f"mongodb://root:root@localhost:27017/players?authSource=admin",
        document_models=[Player]
    )


async def insert():
    await initiate_database()

    son = Player(name="손흥민", back_num=7)
    hwang = Player(name="황희찬", back_num=11)
    lee = Player(name="이강인", back_num=19)

    await son.insert()
    await hwang.insert()
    await lee.insert()


if __name__ == '__main__':
    asyncio.run(insert())

 

위 코드를 실행하면 다음과 같이 players라는 데이터베이스가 생성되고 그 안에 Player라는 컬렉션이 생성되고 손흥민, 황희찬, 이강인 데이터가 삽입됩니다. 

 

 

Read 데이터 조회

이제 방금 넣은 데이터들을 조회해보겠습니다. 

 

from beanie import Document, Indexed, init_beanie
import asyncio


class Player(Document):
    name: Indexed(str)
    back_num: int

    class Settings:
        name = "Player"


async def initiate_database():
    await init_beanie(
        connection_string=f"mongodb://root:root@localhost:27017/players?authSource=admin",
        document_models=[Player]
    )


async def read():
    await initiate_database()
    players = await Player.find({}).to_list()
    
    for player in players:
        print(player.name, player.back_num)


if __name__ == '__main__':
    asyncio.run(read())

 

보시는 것처럼 잘 조회됩니다. 

 

 

Upsert 데이터 수정(없으면 삽입)

이번에는 upsert라는 것을 사용해서 데이터를 수정하겠습니다. upsert는 update와 insert의 조합어로 만약 매칭되는 데이터가 없다면 데이터를 삽입해줍니다. "쏘니"라는 선수명이 있는지 확인한 후 있으면, 손흥민으로 이름을 바꿔주고, 만약 "쏘니"라는 선수가 없다면, "쏘니", 77번인 데이터를 삽입해줍니다. 또한 "황희찬"이라는 선수가 있는지 확인한 후 있다면 선수명을 "황소"로 변경해주고, 없다면 "황희찬", 11번인 데이터를 삽입해줍니다. 

 

from beanie import Document, Indexed, init_beanie
from beanie.odm.operators.update.general import Set
import asyncio


class Player(Document):
    name: Indexed(str)
    back_num: int

    class Settings:
        name = "Player"


async def initiate_database():
    await init_beanie(
        connection_string=f"mongodb://root:root@localhost:27017/players?authSource=admin",
        document_models=[Player]
    )


async def upsert():
    await initiate_database()

    await Player.find_one(Player.name == "쏘니").upsert(
        Set({Player.name: "손흥민"}), 
        on_insert=Player(name="쏘니", back_num=77)
    )

    await Player.find_one(Player.name == "황희찬").upsert(
        Set({Player.name: "황소"}), 
        on_insert=Player(name="황소", back_num=111)    
    )


if __name__ == '__main__':
    asyncio.run(upsert())

 

위 코드를 실행한 후 컬렉션을 살펴보니 쏘니, 77이라는 데이터가 추가되었고, 황희찬이 황소로 바뀌었습니다. 

 

 

Delete 데이터 삭제

마지막으로 이름이 "쏘니"인 데이터를 삭제해보도록 하겠습니다. 

 

from beanie import Document, Indexed, init_beanie
from beanie.odm.operators.update.general import Set
import asyncio


class Player(Document):
    name: Indexed(str)
    back_num: int

    class Settings:
        name = "Player"


async def initiate_database():
    await init_beanie(
        connection_string=f"mongodb://root:root@localhost:27017/players?authSource=admin",
        document_models=[Player]
    )


async def delete():
    await initiate_database()

    await Player.find_one(Player.name == "쏘니").delete()


if __name__ == '__main__':
    asyncio.run(delete())

 

코드를 실행했더니 "쏘니" 데이터가 잘 삭제되었습니다. 

 

 

 

참고자료

[1] https://beanie-odm.dev/tutorial/inserting-into-the-database/