[파이썬] Psycopg2 Green 모드 활용

Introduction

Psycopg2 is a popular PostgreSQL adapter for Python, widely used for database connectivity in Python projects. One of the standout features of Psycopg2 is its ability to seamlessly integrate with asynchronous frameworks. In this blog post, we will explore the usage of Psycopg2 in green mode, which allows performing database operations asynchronously within an event loop.

What is Green mode?

Green mode is a feature introduced in Psycopg2 version 2.3, which enables the library to use a greenlet-based coroutine mechanism for asynchronous I/O. By utilizing greenlets, a lightweight concurrency model, Psycopg2 can handle multiple database connections simultaneously without blocking the event loop.

Setting up Psycopg2 Green mode

Before using Psycopg2 in green mode, we need to install the library. You can install it using pip by running the following command:

pip install psycopg2

Once installed, we need to make sure green mode is enabled. We can set async = 1 in the connection parameters to enable green mode.

import psycopg2
import psycopg2.extensions

psycopg2.extensions.set_wait_callback(psycopg2.extensions.EpollWaitCallback)

Using Psycopg2 Green mode in Python

To demonstrate the usage of Psycopg2 in green mode, let’s consider an example where we want to fetch rows from a database asynchronously. We will be using the asyncio library for managing the event loop.

import asyncio
import psycopg2
import psycopg2.extras

async def fetch_data():
    conn = await asyncio.get_event_loop().run_in_executor(None, psycopg2.connect, "dbname=test user=postgres password=secret")
    cursor = conn.cursor(cursor_factory=psycopg2.extras.RealDictCursor)
    
    await cursor.execute("SELECT * FROM users")
    
    rows = await cursor.fetchall()
    
    await cursor.close()
    conn.close()
    
    return rows

async def main():
    result = await fetch_data()
    print(result)

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

In the example above, we define an async function fetch_data() that connects to the database using the psycopg2.connect() method and executes a query to fetch all rows from the users table. We use the await keyword to wait for the execution of each operation to complete.

Conclusion

Psycopg2 Green mode provides a convenient way to handle database operations asynchronously within an event loop. By using greenlets, Psycopg2 can achieve concurrency without blocking the event loop, resulting in better performance and responsiveness. It is a powerful feature that can be leveraged to build efficient and scalable database-driven applications in Python.

In this blog post, we explored the setup process and demonstrated an example of using Psycopg2 Green mode with asyncio. Now you can incorporate Psycopg2 Green mode into your Python projects to leverage asynchronous database operations.