이번 경우는 아래의 코드처럼 pandas의 DataFrame객체를 mysql db에 삽입하는 과정에서 발생한 에러였다.
engine = create_engine('mysql+mysqlconnector://'+MYSQL_USER+':'+MYSQL_PASSWORD+'@'+MYSQL_HOST_IP+':'+MYSQL_PORT+'/'+MYSQL_DATABASE, echo=False)
df = pd.read_csv("./test.csv")
with engine.connect() as conn, conn.begin():
df.to_sql('Table1', conn, if_exists='replace')
에러 내용은 개략적으로 아래와 같다.
MySQLdb._exceptions.OperationalError: (2059, <NULL>)
sqlalchemy.exc.OperationalError: (MySQLdb._exceptions.OperationalError) (2059, <NULL>)
위와 같은 형태로 나타나는 에러의 본질적인 문제는 같다. 에러가 어디서 발생했는지 에러 스택을 출력하다보니 이렇게 사람에 따라 다른 부분을 볼 수 있어서 검색의 용이성을 위해 둘다 가져다 놓았다.
Windows에서 mysql을 기본 설정으로 설치하다보면 암호 저장의 보안을 강화하는 옵션으로 설치하게 된다. 이 부분의 변경이 필요하다.
MySQL Command Line Client을 실행한 후 다음의 명령어를 입력해보자.
1
2
|
use mysql; select user ,host,plugin from user ; |
위 명령어를 입력하게 되면 다음과 같은 방식으로 계정이 생성된 것을 확인할 수 있다.
+------------------+-----------+-----------------------+
| user | host | plugin |
+------------------+-----------+-----------------------+
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session | localhost | caching_sha2_password |
| mysql.sys | localhost | caching_sha2_password |
| root | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
여기서 바로 'caching_sha2_password'이라는 sha암호화가 문제의 근원이다.
이 부분을 해결하기 위해서는 암호화없는 일반적인 형태로 계정 속성을 변경해야 한다. 마찬가지로 MySQL Command Line Client 에서 아래 명령어를 수행해주자.
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'yourpassword'
이제 다시 입력해보면
+------------------+-----------+-----------------------+
| user | host | plugin |
+------------------+-----------+-----------------------+
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session | localhost | caching_sha2_password |
| mysql.sys | localhost | caching_sha2_password |
| root | localhost | mysql_native_password |
+------------------+-----------+-----------------------+
위와 같이 변경된 것을 확인할 수 있다.
이 상태로 기존의 파이썬 코드를 재실행시키면 정상 동작 한다. 별 것 아닌 '다음' 버튼 클릭 하나가 또 한번 애를 먹였다. 젠장할.
출처: https://gentlesark.tistory.com/85?category=870367 [삵 izz well:티스토리]