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を使う想定です。
# 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を作れるようにします。
# -*- 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 で動的に設定します。
### 一部抜粋
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)