SALAlchemy 의존성 문제를 해결 못함. 미해결 상태.
pymysql이나 mysqlclient 같은 드라이버는 SQLAlchemy가 MySQL 데이터베이스와 통신하기 위해 꼭 필요합니다. SQLAlchemy는 데이터베이스와의 연결을 추상화하는 ORM 도구로, 실제 데이터베이스와 연결하려면 MySQL과 통신할 수 있는 드라이버가 필요합니다.
왜 드라이버가 필요한가?
SQLAlchemy는 데이터베이스와 직접 통신하지 않습니다. 대신, 드라이버를 통해 SQL 쿼리를 전송하고 결과를 반환받습니다. MySQL과 연결하려면 MySQL 프로토콜을 이해하고 처리할 수 있는 드라이버가 필요합니다.
드라이버 옵션
SQLAlchemy에서 MySQL을 사용할 때 선택할 수 있는 드라이버는 다음과 같습니다:
- mysqlclient
- C 기반 드라이버로, 성능이 뛰어나고 안정적입니다.
- 설치 시 MySQL 개발 라이브러리가 필요할 수 있습니다.
- SQLAlchemy 연결 문자열: mysql+mysqldb://
- pymysql
- 순수 Python으로 구현된 드라이버로 설치가 간단합니다.
- 다소 느릴 수 있지만 대부분의 일반적인 애플리케이션에 충분히 빠릅니다.
- SQLAlchemy 연결 문자열: mysql+pymysql://
- MySQL-connector-python
- Oracle이 제공하는 공식 Python 드라이버입니다.
- 특정 기능은 지원하지 않을 수 있습니다.
- SQLAlchemy 연결 문자열: mysql+mysqlconnector://
- asyncmy
- 비동기 환경에서 MySQL을 사용할 수 있는 드라이버입니다.
- SQLAlchemy 연결 문자열: mysql+asyncmy://
드라이버 없이 가능한가?
드라이버 없이 SQLAlchemy를 사용해 MySQL에 연결할 수 없습니다. SQLAlchemy는 자체적으로 데이터베이스 프로토콜을 처리하지 않기 때문에 반드시 드라이버가 필요합니다
- 성능이 중요한 경우: mysqlclient 추천 (설치 과정이 복잡할 수 있음).
- 간단한 설치를 원할 경우: pymysql 추천.
- 비동기 작업을 원할 경우: asyncmy 추천.
- MySQL 개발 라이브러리 필요
- mysqlclient는 MySQL의 C API를 사용하는데, 이를 위해 시스템에 MySQL Client 라이브러리(예: libmysqlclient)가 설치되어 있어야 합니다.
- 예를 들어, Linux에서는 libmysqlclient-dev 또는 mysql-devel 패키지를 설치해야 합니다.
- 컴파일 환경 필요
- 소스 코드를 빌드하는 과정에서 컴파일러가 필요합니다.
- Windows에서는 Visual Studio 빌드 도구가 필요할 수 있습니다.
- Linux/Mac에서는 gcc 같은 기본 컴파일러가 있어야 합니다.
- 운영 체제별 요구 사항 차이
- OS마다 MySQL 개발 라이브러리를 설치하는 방법이 다릅니다.
- Windows의 경우에는 MySQL Connector/C를 수동으로 설치해야 할 수도 있습니다.
Linux
mysqlclient 설치 전에 MySQL 개발 라이브러리를 설치해야 합니다.
- Debian/Ubuntu 기반:
- sudo apt update sudo apt install default-libmysqlclient-dev build-essential pip install mysqlclient
- Red Hat/CentOS 기반:
- sudo yum install mysql-devel gcc pip install mysqlclient
2. Mac
Homebrew를 사용해 MySQL과 필요한 라이브러리를 설치합니다.
brew install mysql
pip install mysqlclient
가상환경에서 실행 할 경우 MySql 라이브러리를 가상환경 내에서 참조 시도를 함으로 인해 오류가 발생할 수 있으므로, 환경변수 설정이 필요할 수 있음
which mysql
{결과값 mysql경로}
가상환경 내에서
export LDFLAGS="-L{mysql경로}/lib"
export CPPFLAGS="-I{mysql경로}/include"
export PATH="{mysql경로}:$PATH"
export DYLD_LIBRARY_PATH="{mysql경로}/lib:$DYLD_LIBRARY_PATH"
또는 shell 설정 파일에 따라
echo 'export LDFLAGS="-L{mysql경로}/lib"' >> ~/.zshrc
echo 'export CPPFLAGS="-I{mysql경로}/include"' >> ~/.zshrc
echo 'export PATH="{mysql경로}/bin:$PATH"' >> ~/.zshrc
echo 'export DYLD_LIBRARY_PATH="{mysql경로}/lib:$DYLD_LIBRARY_PATH"' >> ~/.zshrc
source ~/.zshrc
libmysqlclient.dylib 설치 확인
nm -g {mysql경로}/lib/libmysqlclient.dylib | grep _mysql_affected_rows
0000000000011d4b T _mysql_affected_rows
예시와 같이 결과값이 나오면 _mysql_affected_rows 심볼이 있는 것
python 가상환경의 경우 macOS의 보안정책인 SIP로 인해 DYLD_LIBRARY_PATH 설정이 무시될 수 있음
다만, SIP는 실행 중인 유틸리티를 차단하거나 읽기/쓰기 제한을 적용할 수 있지만, Homebrew 디렉토리(/usr/local/opt/)의 파일을 보호 대상으로 포함하지 않음
otool -L /usr/local/opt/mysql@8.0/lib/libmysqlclient.dylib
/usr/local/opt/mysql@8.0/lib/libmysqlclient.dylib:
/usr/local/opt/mysql@8.0/lib/libmysqlclient.21.dylib (compatibility version 21.0.0, current version 21.2.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.50.4)
- **libssl**과 libcrypto 라이브러리가 /usr/local/opt/openssl@3/lib/ 경로에 있습니다. 이 경로가 올바르게 설정되지 않으면 mysqlclient가 의존성 문제로 작동하지 않을 수 있습니다.
- openssl 경로가 **DYLD_LIBRARY_PATH**에 포함되어 있는지 확인합니다. 이 경로가 설정되지 않으면, mysqlclient가 필요한 libssl을 찾지 못할 수 있습니다.
export DYLD_LIBRARY_PATH="/usr/local/opt/mysql@8.0/lib:/usr/local/opt/openssl@3/lib"
예시와 같이 라이브러리 참조가 정상적인 경우 이상없음, 잘못된 경로를 참조하는 경우 위에 작성한 환경변수 설정 재확인, 암호화 된 데이터가 출력되는 등의 경우 아래 절차 확인
# 파일 유형 확인
file /usr/local/opt/mysql@8.0/lib/libmysqlclient.dylib
# 아래와 같으면 정상 macOS 바이너리
/usr/local/opt/mysql@8.0/lib/libmysqlclient.dylib: Mach-O 64-bit dynamically linked shared library x86_64
# 파일 크기 확인, 파일이 비정상적으로 작은 경우 (예: 12B) 라이브러리 손상, 재설치 필요
ls -lh /usr/local/opt/mysql@8.0/lib/libmysqlclient.dylib
'Server > Python' 카테고리의 다른 글
[python] python bash commend option (0) | 2021.04.09 |
---|---|
[Python] Python 에 대해 주절주절 (0) | 2021.03.26 |
[python][error]Boto3 SignatureDoesNotMatch (0) | 2021.03.25 |
[python] mysql insert datetime (0) | 2021.03.18 |
[python][error] lambda "Cannot load native module" (0) | 2021.03.18 |