LoginSignup
14
14

More than 5 years have passed since last update.

Django + SQLAlchemy + Alembic を使うときのDB設定

Last updated at Posted at 2016-07-12

Djangoの標準ORMは速度的な問題があったりするので、SQLAlchemyを使いたくなる場合があります。
しかし、SQLAlchemyのマイグレーションはこれもあまりイケてないので、かわりにAlembicを使ってマイグレーションを行いたいと思います。

それぞれ独立したモジュールなので各々DBの設定は異なる方法で行っています。バラバラに書くのは面倒なのでSQLAlchemyとAlembicはDjangoの設定を参照する形にしました。

ファイル構成

まず、以下のようなファイル構成を想定します。

myProject/ +--- manage.py
           +--- alembic/ ---+-- env.py
           |                +--- 他
           +--- alembic.ini
           +--- myProject/ -+-- settings.py
           |                +--- 他
           +--- myApp/ -----+-- models.py
                            +--- 他

Djangoの設定

これは標準的な設定方法でそのままにします。
mysqlを使う想定です。

settings.py
# Database

DATABASE_ENGINE = 'mysql'
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'xxxx',      # 適当です
        'USER': 'xxxx',      # 適当です
        'PASSWORD': 'xxxx',  # 適当です
        'HOST': 'xxxx',      # 適当です
        'PORT': 'xxxx',      # 適当です
        'OPTIONS': {},       # 必要があれば
    }
}

SQLALCHEMY_OPTIONS = {} # SQLAlchemyに設定を行う必要があれば

SQLAlchemyの設定

sqlalchemyはsessionを作る際にDBの設定をする必要になります。
myProject/myProject に db.py というファイルを作りsessionを作る必要がある場合このファイルを読み込んでsessionを作れるようにします。

myProject/myProject/db.py
# -*- coding: utf-8 -*-
"""db session and util."""

from myProject import settings

import sqlalchemy.orm

from sqlalchemy.engine.url import URL

def db_url():
    db_settings = settings.DATABASES['default']
    url = URL(drivername=settings.DATABASE_ENGINE,
        database=db_settings['NAME'],
        username=db_settings['USER'],
        password=db_settings['PASSWORD'],
        host=db_settings['HOST'],
        port=db_settings['PORT'] or None,
        query = getattr(db_settings, 'OPTIONS', {})
        )
    return url

def create_engine():
    try:
        url = db_url()
    except:
        raise
    options = getattr(settings.DATABASES['default'], 'SQLALCHEMY_OPTIONS', {})
    engine = sqlalchemy.create_engine(url, **options)
    return engine

def make_session():
    Session = sqlalchemy.orm.sessionmaker(bind=create_engine())
    session = Session()
    return session

Alembic

基本的にalembicのDBの設定はalembic.iniから設定します。
しかし、これだとそのままではsettings.pyファイルから参照する形ではなく不便なので、alembic/env.py で動的に設定します。

env.py
### 一部抜粋
import os
import sys

from alembic import context

# このファイルがある位置的にそのままだとsettingsが読み込めないのでパスを通す
path = os.path.join(os.path.dirname(__file__), '../')
sys.path.append(path)

from user import models
from myProject.db import db_url

config = context.config

# URLを設定
url = str(db_url())
config.set_main_option("sqlalchemy.url", url)
14
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
14