MariaDB를 Flask API에 연결하기

이상민·2021년 2월 22일
0

1. MySQL 설치

sudo dnf install mysql-server

페도라는 mariaDB로 옮겼기 때문에 위 명령어로 설치해도 mariaDB가 설치된다

sudo mysql_secure_installation

사용하기전 루트 비밀번호등 설정을 위 명령어를 실행해 한번에 설정할 수 있다. sudo 없이 실행하면 실행되지 않는다.


2. 서비스 실행

service mariadb.service start
service mariadb.service status
service mariadb.service stop

start로 실행, status로 상태를 확인, stop으로 멈출 수 있다.


3. MySQL 실행

mysql -u root -p

mysql을 root 유저(-u)로 비밀번호를 직접 입력(-p)하여 실행


4. 데이터베이스 생성 및 사용

CREATE DATABASE database_name;
USE database_name;
CREATE TABLE table_name (
    column1 data_type options,
    column2 data_type options,
    ...
    PRIMARY KEY (column),
    CONSTRAINT 1,
    CONSTRAINT 2
);

5. SQLAlchemy 설치

SQLAlchemy는 파이썬에서 DB와 연결하기 위해 사용하는 가장 대표적인 라이브러리이다. SQLAlchemy는 ORM과 CORE 부분으로 나눠진다. ORM(Object Relational Mapper)은 RDB와 객체를 맵핑해줘 SQL을 사용하지 않고 프로그램 언어 내에서 객체들로 데이터베이스 사용을 가능하게 한다. CORE는 query builder로 SQL 쿼리를 생성하고 쿼리 결과를 파이썬 자료형으로 가져오는 등의 기능을 수행한다.

pip install sqlalchemy

SQLAlchemy에서 DBMS를 사용하기 위해서는 위 그림처럼 DBAPI도 필요하다

pip install mysql-connector-python

6. MariaDB를 Flask API에 연결하기

SQLAlchemy를 통해 다음과 같은 형태로 MariaDB를 Flask에서 사용할 수 있다

# /config.py
db = {
    'user': 'root'
    'password': 'pwd_example'
    'host': 'localhost',
    'port': 3306,
    'database': 'database_name'
}

db_url = f"mysql+mysqlconnector://{db['user']}:{'db[password']}@" \
         f"{db['host']}:{db['port']}/{db['database']?charset=utf8"
  • db : 데이터베이스에 연결하기 위해선 DB접속 정보가 필요하다. 아이디, 비밀번호, 접속할 DBMS 주소, 데이터베이스 이름 등이 필요하다. RDBMS는 주로 3306 포트를 통해 연결된다.

  • db_url : db의 정보를 이용해 DB URL을 구성한다. 이를 사용해 실제 DB에 접속할 수 있다.

# /app.py
from flask import Flask, jsonify
from sqlalchemy import create_engine, text

def create_app():
    app = Flask(__name__)
    app.config.from_pyfile("config.py")
    
    database = create_engine(app.config['db_url'], encoding='utf-8', max_overflow=0)
    app.database = database
    
    @app.route('/example/<string:user_name>', methods=['GET'])
    def get_email(user_name):
        params = {'name': user_name}
        row = app.database.execute(text("""
            SELECT * 
            FROM users 
            WHERE name = :name
        """), params).fetchone()
        return jsonify({'email': row['email']})
    
    return app                                  
  • create_engine() : 이 함수를 통해 db_url에 명시된 DB에 접속한다. Engine 객체를 반환하는데, 이 객체를 사용해 연결된 DB에 SQL를 실행할 수 있다.

  • database.execute() : Engine 객체의 execute() 메소드로 SQL을 DB에 전송해 실행한다. SQL 구문과 구문에 필요한 인자들의 값(딕셔너리) 2개의 인자를 받는다.

  • text() : 이 함수에 전달된 문자열에 ':'이 포함되어 있으면 ':' 다음에 오는 단어와 동일한 키를 사용해 딕셔너리에서 읽어 치환한다. 여기서 "WHERE name = :name"은 "WHERE name = user_name"과 같다.

profile
편하게 읽기 좋은 단위의 포스트를 추구하는 개발자입니다

0개의 댓글