파이썬 - SQLAlchemy + oracledb 연동
지난 글에서 oracledb 연동을 설명했는데요,
파이썬 - oracledb 패키지 연동 시 Thin / Thick 모드
; https://www.sysnet.pe.kr/2/0/13882
SQLAlchemy를 그 위에 얹고 싶다면,
Installation Guide
; https://docs.sqlalchemy.org/en/20/intro.html#installation
$ python3 -m pip install SQLAlchemy
import sqlalchemy
print(sqlalchemy.__version__)
create_engine 함수에 적당한 DSN을 넣어주면 됩니다.
Establishing Connectivity - the Engine
; https://docs.sqlalchemy.org/en/20/tutorial/engine.html
# oracledb인 경우
from sqlalchemy import create_engine
engine = create_engine("oracle+oracledb://hr:hr_password@:192.168.100.50:1521/?service_name=XE")
# cx_Oracle인 경우
from sqlalchemy import create_engine
engine = create_engine("oracle+cx_oracle://hr:hr_password@:192.168.100.50:1521/?service_name=XE")
이후 적당하게 자신의 상황에 맞게 쿼리를 날리면 되겠습니다. ^^
Working with Transactions and the DBAPI
; https://docs.sqlalchemy.org/en/20/tutorial/dbapi_transactions.html
from sqlalchemy import text
record_text = ""
with engine.connect() as conn:
result = conn.execute(text("select * from departments"))
for row in result:
record_text += str(row) + "\n"
비동기 버전을 사용하고 싶다면, create_async_engine을 이용할 수 있습니다.
Asynchronous I/O (asyncio)
; https://docs.sqlalchemy.org/en/20/orm/extensions/asyncio.html
코딩 방식은 동기를 사용했을 때와 비교해 await를 지정해야 한다는 정도의 차이만 있어서 변환도 어렵지 않습니다.
from sqlalchemy.ext.asyncio import create_async_engine
async_engine = create_async_engine("oracle+oracledb://hr:hr_password@192.168.100.50:1521/?service_name=XE")
async with async_engine.connect() as conn:
result = await conn.execute(text("select * from departments"))
for row in result:
record_text += str(row) + "\n"
oracle과 연동한 비동기의 한 가지 제약이 있다면, thin mode로만 동작한다는 점입니다. 그래서 init_oracle_client를 호출한 경우에는 실행 시 이런 오류가 발생합니다.
Traceback (most recent call last):
File "/home/testusr/py38v/debug_fastapi_router/lib/python3.8/site-packages/uvicorn/protocols/http/h11_impl.py", line 406, in run_asgi
result = await app( # type: ignore[func-returns-value]
...[생략]...
File "/mnt/c/temp/main.py", line 356, in sqlalchemy_test
with engine.connect() as conn:
...[생략]...
File "/home/testusr/py38v/debug_fastapi_router/lib/python3.8/site-packages/sqlalchemy/event/attr.py", line 497, in __call__
fn(*args, **kw)
File "/home/testusr/py38v/debug_fastapi_router/lib/python3.8/site-packages/sqlalchemy/engine/create.py", line 724, in on_connect
do_on_connect(dbapi_connection)
File "/home/testusr/py38v/debug_fastapi_router/lib/python3.8/site-packages/sqlalchemy/dialects/oracle/cx_oracle.py", line 1383, in on_connect
conn.outputtypehandler = output_type_handler
AttributeError: 'NoneType' object has no attribute 'outputtypehandler'
따라서, 비동기를 사용하고 싶다면 오라클 서버의 버전을 높여야만 하고, 그렇게 할 수 없다면 동기 + thick mode로 사용해야만 합니다.
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]