PyO3를 활용한 파이썬 프로젝트의 데이터베이스 연동 방법

파이썬은 데이터베이스와의 연동을 위해 다양한 라이브러리들이 존재하지만, Rust의 PyO3 라이브러리를 사용하여 파이썬 프로젝트와 데이터베이스를 연동할 수도 있습니다. 이를 통해 파이썬의 편리함과 Rust의 성능을 모두 활용할 수 있게 됩니다.

PyO3란?

PyO3는 러스트(Rust)용 파이썬 바인딩 도구로, 러스트로 작성된 함수나 구조체 등을 파이썬에서 사용할 수 있게 해줍니다. PyO3를 사용하면 러스트의 속도와 안정성을 파이썬 프로젝트에서도 이용할 수 있습니다.

데이터베이스 연동을 위한 준비

먼저, PyO3를 설치해야 합니다. 다음은 PyO3를 설치하는 명령어입니다.

$ pip install pyo3

또한, 데이터베이스에 접속하기 위해 필요한 드라이버를 설치해야 합니다. 이 예시에서는 SQLite 데이터베이스를 사용하기 때문에 sqlite3 패키지를 설치하겠습니다.

$ pip install sqlite3

데이터베이스 연동하기

PyO3를 사용하여 파이썬 프로젝트와 SQLite 데이터베이스를 연동해보겠습니다. 먼저, db.rs라는 파일을 생성하고 다음 코드를 작성해주세요.

use pyo3::prelude::*;
use pyo3::types::{IntoPyDict, PyDict, PyTuple};

#[pymodule]
fn db(_py: Python, m: &PyModule) -> PyResult<()> {
    #[pyfn(m, "connect")]
    fn connect(_: Python) -> PyResult<i32> {
        // 데이터베이스 연결 코드 작성
        Ok(0)
    }

    #[pyfn(m, "get_data")]
    fn get_data(_: Python) -> PyResult<Vec<String>> {
        // 데이터 조회 코드 작성
        Ok(vec!["data1".to_string(), "data2".to_string()])
    }

    m.add_function(py_fn!(connect))?;
    m.add_function(py_fn!(get_data))?;

    Ok(())
}

/// Initialize the module
#[pymodule]
fn python_database(py: Python, m: &PyModule) -> PyResult<()> {
    m.add_submodule(PyModule::new(py, "db")?.into_py_dict(py))?;
    Ok(())
}

#[pymodule]
fn rust_bindings(py: Python, m: &PyModule) -> PyResult<()> {
    m.add_submodule(db(py, m)?)?;
    m.add_submodule(python_database(py, m)?)?;
    Ok(())
}

#[panic_handler]
fn panic_handler(info: &core::panic::PanicInfo) -> ! {
    // Panic 처리 코드 작성
    loop {}
}

#[no_mangle]
pub extern "C" fn PyInit_rust_bindings() -> PyResult<()> {
    Python::with_gil(|py| {
        let m = PyModule::new(py, "rust_bindings")?;
        rust_bindings(py, &m)?;
        m.add("__doc__", "Rust bindings for Python")?;

        Ok(())
    })
}

위 코드는 rust_bindings라는 러스트 모듈을 생성하고, db.rs라는 파일을 서브모듈로 추가하는 예시입니다. 해당 코드에서는 connect 함수와 get_data 함수를 파이썬에서 호출할 수 있도록 정의하고, 각 함수에서는 데이터베이스 연결 및 조회 코드를 작성하면 됩니다.

파이썬에서 러스트 모듈 사용하기

이제, 파이썬에서 러스트 모듈을 사용해보겠습니다. 다음은 파이썬 스크립트 예시입니다.

import rust_bindings

# 데이터베이스 연결
connection = rust_bindings.db.connect()

# 데이터 조회
data = rust_bindings.db.get_data()

print(data)

위 예시 코드에서는 rust_bindings 모듈을 가져온 후, db 서브모듈의 connect 함수를 호출하여 데이터베이스에 접속하고, get_data 함수를 사용하여 데이터를 조회합니다. 조회된 데이터는 출력됩니다.

이제 파이썬 프로젝트에서 PyO3를 사용하여 데이터베이스와의 연동을 할 수 있게 되었습니다.

결론

PyO3를 활용하여 파이썬 프로젝트와 데이터베이스를 연동하는 방법을 알아보았습니다. PyO3를 사용하면 Rust의 성능과 파이썬의 편리함을 모두 활용할 수 있어, 데이터베이스 작업을 보다 효율적으로 처리할 수 있습니다.

#PyO3 #데이터베이스연동