14
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?