개발된 프로젝트를 넘겨 받아 수정할 일이 생겨 database 부터 설정하는데 참 뭐하나 쉽게 넘어가질 않는다. 😑 힘들게 설치한 과정을 적으려고 한다.
개발환경은 flask+node.js 인데 db 부분은 모두 flask에서 처리한다.
일단 python 환경에서 SQLAlchemy, Flask-SQLAlchemy은 설치돼있어 mysql을 설치하려고 MySQLdb
모듈 설치를 시도했다.
ModuleNotFoundError: No module named 'pip'
pip install MySQLdb
를 하니 ModuleNotFoundError: No module named 'MySQLdb'
라고 에러가 뜬다. 이번에는 pip install MySQL-python
을 실행해보니 ModuleNotFoundError: No module named 'pip'
에러가 뜨네..?😵
이전에 pip upgrade를 했었는데 제대로 진행이 안된 상태로 mysql을 설치하는 단계로 넘어갔어서 생긴 에러이다..
설치할 때 권한 문제로 업그레이드가 실패되고 pip가 없어져 자주 생기는 현상이라고 한다.
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python get-pip.py
차례대로 실행해주니 pip가 잘먹힌다 !!!
이제 mysql을 설치하려고 pip install MySQL-python
또는 pip install MySQLdb
입력하니 이번에 만난 에러.
C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29333\bin\HostX86\x86\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD -Dversion_info=(1,2,5,'final',1) -D__version__=1.2.5 "-IC:\Program Files (x86)\MySQL\MySQL Connector C 6.0.2\include" -Id:\2020-winter\flask\venv\include -Id:\downloads\include -Id:\downloads\include "-IC:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29333\include" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\ucrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\shared" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\um" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\winrt" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\cppwinrt" /Tc_mysql.c /Fobuild\temp.win32-3.8\Release\_mysql.obj /Zl
_mysql.c
_mysql.c(42): fatal error C1083: 포함 파일을 열 수 없습니다. 'config-win.h': No such file or directory
error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\BuildTools\\VC\\Tools\\MSVC\\14.28.29333\\bin\\HostX86\\x86\\cl.exe' failed with exit status 2
----------------------------------------
ERROR: Command errored out with exit status 1: 'd:\2020-winter\flask\venv\scripts\python.exe' -u -c 'import io, os, sys, setuptools, tokenize; sys.argv[0] = '"'"'C:\\Users\\User\\AppData\\Local\\Temp\\pip-install-uwjbz67b\\mysql-python_6cc275ca9c1541fe8cac4240f0e416dc\\setup.py'"'"'; __file__='"'"'C:\\Users\\User\\AppData\\Local\\Temp\\pip-install-uwjbz67b\\mysql-python_6cc275ca9c1541fe8cac4240f0e416dc\\setup.py'"'"';f = getattr(tokenize, '"'"'open'"'"', open)(__file__) if os.path.exists(__file__) else io.StringIO('"'"'from setuptools import setup; setup()'"'"');code = f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record 'C:\Users\User\AppData\Local\Temp\pip-record-zdvpphoj\install-record.txt' --single-version-externally-managed --compile --install-headers 'd:\2020-winter\flask\venv\include\site\python3.8\MySQL-python' Check the logs for full command output.
WARNING: Ignoring invalid distribution -ip (d:\2020-winter\flask\venv\lib\site-packages)
WARNING: Ignoring invalid distribution -ip (d:\2020-winter\flask\venv\lib\site-packages)
찾아 보니 mysql 모듈 설치에서 에러가 많은 것 같다.
해결 방법은 윈도우 바이너리를 다운로드 받아서 설치하면 된다고 한단다.
아래 사이트에서 자기의 python 버전과 window 버전에 맞춰 다운로드 받으면 된다.
https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient.Then
나는 python2는 없고 python3만 설치돼있다.
자기의 python 버전을 알고 싶다면 그냥 cmd 창에서 python
을 입력하면 된다.
나는 3.8 버전이고 win32라서
mysqlclient‑1.4.6‑cp38‑cp38‑win32.whl
로 다운로드하면 된다.
다운로드하고 나서는 cmd를 열어 다운로드된 경로에서 pip install mysqlclient‑1.4.6‑cp38‑cp38‑win32.whl
를 입력하여 설치했다.
❗ 여기서 꿀팁 ! cmd에서 pip install 뒤에 mysql~ 저 긴 문장을 직접 치다가 헷갈릴 수 있는데 mysql 정도 까지 치고 tab
을 누르면 같은 이름의 다운로드 파일이 나온다 이를 활용하면 빨리 파일 이름을 찾을 수 있다.
pip list
명령어로 설치된 모듈을 확인해보니 mysqlclient 1.4.6
설치가 성공적으로 되었다!
이제 db도 설치됐겠다. 이미 기존에 작성된 manage.py
(flask_scripts를 활용하여 db를 세팅하기 위한 스크립트가 작성돼있음. 해당 내용은 다른 글에서 확인할 수 있음!)를 실행하려니 이번에는 이런 에러가 뜬다.
MySQLdb._exceptions.OperationalError: (2003, "Can't connect to MySQL server on '127.0.0.1' (10061)")
Mysql를 설치해서 서버를 실행해야 한다네 🤪
나는 msi installer로 설치했다! installer 다운로드 후 실행하여 설치를 진행한다. 그냥 계속 next만 누르고 입력한 password나 외웠다.
이제 mysql이 성공적으로 설치가 됐다. 여기서 끝난게 아니고 환경 변수 설정을 해줘야 한다. 나는 C:\Program Files\MySQL\MySQL Server 8.0\bin
여기 경로에 있어 해당 경로로 설정해줬다.
환경 변수는 쉽게 윈도우 작업표시줄의 검색에다가
환경 변수
입력한 후 나오는시스템 환경 변수 편집
을 눌러 실행된시스템 속성
하단의환경 변수
에서 시스템 변수의path
에다가 해당 경로를 추가하면 된다 !
mysql 서비스가 잘도나 확인하기 위해 또 검색창에 서비스
를 입력 후 실행시켜
이렇게 mysql이 잘 돌고 있는 지를 확인하면 된다.
그리고 cmd 창에서 C:\Users\User>mysql -u root -p
를 치고 아까 installer에서 입력한 password를 입력하면 mysql을 cmd에서 다룰 수 있게 된다.
기존 flask 코드에서 flask-sqlalchemy의 SQLALCHEMY_DATABASE_URI로 설정돼있는 user@password에 맞춰주기 위해 새로운 user를 생성했다.
mysql> CREATE USER 'dbadmin'@'127.0.0.1' IDENTIFIED BY 'password1234';
MySQLdb._exceptions.OperationalError: (2059, <NULL>)
이제 user도 생성했고 다 됐겠거니 python manage.py
를 실행하니 MySQLdb._exceptions.OperationalError: (2059, <NULL>)
이런 에러가 뜬다.
찾아보니 윈도우에서 mysql을 설치할 때 암호 보안을 강화하는 옵션으로 설치하게 돼서 생기는 문제라고 한다.
user 테이블에서 이를 확인할 수 있다.
mysql> use mysql;
mysql> select user, host, plugin from user;
plugin에 모두 sha2 로 보안이 강화된 옵션으로 설정이 돼있는 것을 확인할 수 있다.
아까 생성한 'dbadmin'의 암호를 mysql_native_password로 바꿔줘야 한다.
mysql> alter user 'dbadmin'@'127.0.0.1' identified with mysql_native_password by 'password1234'
MySQLdb._exceptions.OperationalError: (1044)
이렇게 변경한 다음 또 python manage.py
를 실행하면 안된다 ^^
MySQLdb._exceptions.OperationalError: (1044, "Access denied for user 'dbadmin'@'127.0.0.1' to database 'table'")
이 에러는 database 'table'에 access permission이 없다는 것. 새로 생성한 user에게 permission을 줘야 한다.
mysql> grant all privileges on table.* to 'dbadmin'@'%' identified by 'password1234';
'%'은 외부 접속자에게도 db에 접근할 권한을 주는 것.
또 manage.py
를 실행하면
안된다.
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'identified by 'password1234'' at line 1
철자가 틀렸나 확인해도 틀린게 없다.
뭐야😠 하고 찾아보니 위에 명령어는 이전 버전이고 명령어가 달라졌다고 한다 아이 재밌어라 😊
grant all privileges on table.* to dbadmin@127.0.0.1;
이제 실행이 됐다.
이제 끝이겠거니 manage.py
를 실행하는데..
MySQLdb._exceptions.OperationalError: (1049, "Unknown database 'table'")
database 를 안 만들었네 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
이제 진짜 최종 최종 final로
mysql> create database table;
까지 해주니
python manage.py init_db
가 실행되면서 db 테이블과 sample data가 생성됐다. 🥰😆😊
여쭤보면 빨리 해결될 문제였지만 그래도 직접 해결하니 뿌듯하긴 하다.
이제 db 수정해야딩 💚