이것저것

(2) pycharm에 mysql 불러오기 본문

Python

(2) pycharm에 mysql 불러오기

곰태태 2023. 11. 22. 16:19
반응형
SMALL

참조

https://wikidocs.net/81045

 

2-04 모델로 데이터 처리하기

* `[완성 소스]` : [github.com/pahkey/jump2flask/tree/2-04](https://github.com/pahkey/jump2flask/tree/2-…

wikidocs.net

 

우선 mysql workbench에서 작업을 한뒤에 pycharm에서 불러오기로했다.

test 용으로 하기위해 test.py라는 파일에서 우선 작업했다.

import pymysql

db = pymysql.connect(host="127.0.0.1",user="root",password="1234", db="dms", charset="utf8")

#cursor는 Connection으로부터 Cursor를 생성하고, db의 sql문을 실행하고 조회된 결과를 가져오는 역할을 한다.
cursor = db.cursor()

sql = "select * from users"

# execute : cursor 객체에 sql문을 실행, 지금은 user table을 불러왔다.
# -executemany : cursor 객체에 동일한 sql문에 파라미터를 변경하여 실행한다.
# -executescript : cursor객체에 세미콜론으로 구분된 여러줄의 sql문을 실행한다.
cursor.execute(sql)

# db 데이터 가져오기 cursor의 메소드
# cursor.fetchall() #모든 행 가져오기
# cursor.fetchone() # 하나의 행만 가져오기
# cursor.fetchmany() # n개의 데이터 가져오기 (n)이렇게 넣어주면된다.
rows = cursor.fetchall()
print(rows)

# DB에 생성, 삭제, 수정등 데이터 변동이 생기면 commit()으로 저장을 해줘야한다.
db.commit()

db.close()

host는 flask 실행했을때 나온 주소를 넣어도 되고 "localhost"라고 적어도된다.

뒤에 :5000은 port니까 빼고 적어줘야한다.

user는 mysql workbanch 생성할때 만든 아이디, password는 아이디 만들때 작성한 비밀번호

대부분 root에 1234로 작성한다.

db는 workbanch에서 만든 db이름 charset은 한글 지원하도록 utf-8

 

sql = 뒤에 select 부분은 sql 구분인데 users라는 테이블은 내가 생성해서 나오는거니

보통은 자신이 만든 테이블 이름을 작성해주면된다.

 

이 코드는 점프 투 플라스크에서 쓰는 코드와 상관없이 그냥 MySQL 데이터가 불러와지는지 확인 차 사용한 코드이다.


MySQL과 Flask를 연동하기 위해서 ORM이라는 플라스크 라이브러리를 사용할 예정이다.

가장 기본인 설치부터하자

pip install flask-migrate

flask-migrate를 설치하게되면 mysql이나 sql lite를 사용할때 필요한 SQLAlchemy도 함께 설치되므로 편하다.

 

점프 투 플라스크에서는 sql-lite를 사용하지만 나는 MySQL을 사용하므로 MySQL에 맞게 수정하였다.

config.py 파일을 만들어서 MySQL 데이터베이스 접속 주소를 불러오자

SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:1234@localhost/dms'
SQLALCHEMY_TRACK_MODIFICATIONS = False

config.py는 루트 디렉토리에 생성하면된다.

 

그리고 이제 ORM을 적용하는 코드이다.

__init__.py 파일을 수정하면된다.

from flask import Flask
from flask_migrate import Migrate
from flask_sqlalchemy import SQLAlchemy

import config

db = SQLAlchemy()
migrate = Migrate()

# create_app함수가 app 객체를 생성해 반환하도록 하는 이유는
# app=Flask(__name__)을 전역으로 사용하게되면 오류가 발생하기 때문(순환 참조 오류)
# create_app이 '애플리케이션 팩토리'이다.
# create_app 대신 다른 이름을 사용하면 정상작동하지 않는다.
def create_app():
    app = Flask(__name__)
    app.config.from_object(config)

    # ORM
    db.init_app(app)
    migrate.init_app(app, db)

    # 블루프린트 작업 : Flask에서 URL과 함수의 매핑을 관리하기 위해 사용하는 도구이다.
    # 블루프린트를 이용하면 라우팅 함수를 체계적으로 관리할 수 있다.
    from .views import main_views
    app.register_blueprint(main_views.bp)

    return app

이렇게 config.py 파일을 import 한뒤 불러오기 위해 app.config.from_object(config) 코드를 추가하고 전역변수로 db, migrate 객체를 만든다음 create_app 함수 안에서 init_app 메서드를 이용해 app에 등록했다는 코드라고한다...

-점프 투 플라스크 그대로 참조-

플라스크는 이러한 패턴을 자주 사용한다. db 객체를 create_app 함수 안에서 생성하면 블루프린트와 같은 다른 모듈에서 사용할수 없기 때문에 db, migrate와 같은 객체를 create_app 함수 밖에 생성하고, 해당 객체를 앱에 등록할 때는 create_app 함수에서 init_app 함수를 통해 진행한다.

 

그리고 이제 데이터 베이스를 초기화해서 migrations라는 디렉토리가 자동으로 생성되게해야하는데...

여기서 막혔었다.

flask db init을 통해서 데이터베이스를 관리하는 초기 파일들을 생성해야하는데

계속 

Error: Could not locate a Flask application. Use the 'flask --app' option, 'FLASK_APP' environment variable, or a 'wsgi.py' or 'app.py' file in the current directory.

Usage: flask [OPTIONS] COMMAND [ARGS]...
Try 'flask --help' for help.

Error: No such command 'db'.

계속 이런 오류가 떠서
set FLASK_APP=pybo

set FLASK_DEBUG=true
를 따로 터미널에서 입력하고 flask db init도 해보고

run_dms.cmd를 cmd창에 들어가서 실행한뒤 flask db init을 해보고 별걸 다해봤는데 해결이 되지않았다...

결국에 flask db init은 최조 한번만 수행하면 된다는 말에서

run_dms.cmd에서 실행할때 수행하면 되지 않을까 생각하고  run_dms.cmd에 넣어보았다.

@echo off
cd c:/dev/Python/DMS
set FLASK_APP=pybo
set FLASK_DEBUG=true

flask db init

call C:\Users\KOSA\anaconda3\envs\DMS\Lib\venv\scripts\nt\activate
flask run

pause

이렇게 set FLASK_DEBUG=true 다음에 바로 실행되게 flask db init을 넣어준뒤

run_dms를 했더니 바로 migrations가 생성되었다...

test.py는 상관없고
위에 migrations가 생성되면된다.
안에 파일들은 자동으로 생성된다.

(파일들이 무슨역할을 하는지는 몰라도된다고한다(?))

 

후...

일단 run_dms를 실행할때마다 데이터 베이스가 초기화 되면 안될꺼 같아서 처음 실행할때만 작성해주고

지워놨다....

계속 적어놔도 되는지는 더 알아봐야겠다.

지우는게 맞다고한다.

반응형
LIST
Comments