오픈 소스/python-mysql

python-mysql-replication NameError: name 'byte2int' is not defined 오류 및 해결

ebang 2023. 7. 16. 00:12

설명

환경 : python3, pymysql 1.1.0

오류 byte2int 라는 함수가 없다는 오류

 

이유

byte2int 함수는 pymysql.util 이라는 package 안에 있습니다.

 

근데 pymyql.util 이 없어서 byte2int 를 가져오지 못하는 이슈들이 많이 있었습니다.  (참고링크)

 

찾아본 결과, pymysql > 0.1 버전에서는 존재하지 않게 되는 문제가 있었습니다.

(pymysql > 0.1 버전에서는 pymysql.util 이 import 가 되지 않는 이슈)

 

왜냐면 이 라이브러리를 import 하는 과정에는 aiomysql 가 import 되어야 하는데,

requirements patch 가 제대로 안된 이유로 0.10 보다 큰 버전을 allow 하지 않기 때문입니다.

 

해결책

그래서 두가지 해결방법을 알아냈습니다.

참고링크

첫번째 해결책

첫번째는 aimysql 라이브러리를 대체하는 asyncmy 라이브러리에서 byte2int 함수를 가져오는 방법을 제시합니다.

 

어떤 라이브러리인가보면, 이런 역할을 하고 있습니다. 

 

살펴보니, aiomysql 라이브러리는 asyncio에서 Mysql database에 접근하기 위해 필요한 라이브러리인데 현재는 pymysql과 호환이 잘 안되는 이슈가 있고, (아래 참고)

저 위의 프로젝트 위에 구축되어있다고 설명되어 있습니다. 

 

 

해결 : 

  • (가상환경 터미널에서 pip install asyncmy 하고 난 후)
  • python -mysql-replication/pymysqlreplication/event.py" 경로에
	from asyncmy.replication.utils import byte2int

를 추가

 

 

두번째 해결책

문제 상황에 적힌 #122126 이슈로 타고 들어가면 또다른 해결책을 제시하는데, 위 두가지 링크를 제시합니다.

  1. https://github.com/PyMySQL/PyMySQL/blob/37fd1e1b0126d75d80eef59c053f80634b09bd75/pymysql/connections.py#L96-L113
  2. https://github.com/PyMySQL/PyMySQL/blob/v0.10.1/pymysql/util.py

이 방법은 util.py 에 byte2int 가 따로 지정되어있던 구 버전(0.10.1)의 파일을 가지고 오는 방법입니다.

해결:

2. 링크의 문서 복사하고 붙여넣기해서 import (혹은 저 버전으로 commit 되돌리기)

 

  • 추가자료

관련된 이슈들

mysql asyncmy driver by aminalaee · Pull Request #382 · encode/databases

pymysql tests only work with pymysql<=1.0 · Issue #330 · encode/databases

python3Packages.databases: 0.2.6 -> 0.4.3 by mweinelt · Pull Request #122125 · NixOS/nixpkgs

SQLAlchemy documentation:

 

MySQL and MariaDB — SQLAlchemy 1.4 Documentation

MySQL and MariaDB Support for the MySQL / MariaDB database. The following table summarizes current support levels for database release versions. DBAPI Support The following dialect/DBAPI options are available. Please refer to individual DBAPI sections for

docs.sqlalchemy.org

특히 이 문서를 보면  라이브러리가 더이상 pyton 3.10 과 호환되지 않고 pymysql 구버전과만 호환된다고 적혀있습니다.