[파이썬] Peewee 비동기 연결 및 쿼리

Peewee is a lightweight and expressive Object-Relational Mapping (ORM) library for Python. It provides a simple and intuitive interface to interact with databases using Python objects. In addition to its synchronous capabilities, Peewee also supports asynchronous connections and queries, which can greatly enhance the performance of your application.

In this blog post, we will explore how to establish an asynchronous connection to a database using Peewee and perform asynchronous queries.

Setting up the Environment

Before we dive into the code, let’s make sure we have all the necessary dependencies installed. You will need:

You can install Peewee and asyncio using pip:

pip install peewee asyncio

Asynchronous Connection

To establish an asynchronous connection to a database with Peewee, we need to use an asynchronous version of the database driver. For example, if you are using MySQL, you can install the aiomysql package:

pip install aiomysql

Once we have the driver installed, we can configure Peewee to use it. Here’s an example for establishing an asynchronous connection to a MySQL database:

import peewee
import peewee_async

database = peewee_async.MySQLDatabase('mydb', host='localhost', port=3306, user='root', password='password')

class BaseModel(peewee.Model):
    class Meta:
        database = database

async def connect():
    await database.connect_async()

async def close():
    await database.close_async()

# Create an instance of the Peewee async manager
manager = peewee_async.Manager(database)

# Set the manager for all models
BaseModel.use_async(manager)

In the code above, we create an asynchronous MySQLDatabase instance and define a base model that all other models will inherit from. We also define two async functions, connect and close, to connect and disconnect from the database.

Asynchronous Queries

Now that we have configured the asynchronous connection, let’s explore how to perform asynchronous queries with Peewee.

from peewee import *

class User(BaseModel):
    username = CharField()
    email = CharField()

async def fetch_users():
    users = await User.all()
    for user in users:
        print(user.username)

async def create_user(username, email):
    user = await User.create(username=username, email=email)
    print(f"Created user: {user.username}")

async def update_user(user_id, new_username):
    user = await User.get(User.id == user_id)
    user.username = new_username
    await user.save()
    print(f"Updated user: {user.username}")

async def delete_user(user_id):
    user = await User.get(User.id == user_id)
    await user.delete_instance()
    print("User deleted")

In the code above, we define a User model that represents a table in the database. We then define several async functions to perform different operations on the User table. We use the await keyword to indicate that these functions are asynchronous.

Wrapping Up

In this blog post, we have explored how to establish an asynchronous connection to a database using Peewee and perform asynchronous queries. By using asynchronous operations, we can improve the performance of our application by avoiding blocking I/O calls.

Peewee’s support for asynchronous connections and queries makes it a powerful ORM library for building high-performance Python applications. By leveraging the power of asyncio, we can write efficient and scalable database interactions.

Happy coding!