Django's standard ORM can be speedy and you may want to use SQLAlchemy. However, SQLAlchemy migration isn't very cool either, so I'd like to use Alembic instead.
Since each is an independent module, each DB is set in a different way. SQLAlchemy and Alembic refer to Django's settings because it's a hassle to write them separately.
First, assume the following file structure.
myProject/ +--- manage.py
+--- alembic/ ---+-- env.py
| +---other
+--- alembic.ini
+--- myProject/ -+-- settings.py
| +---other
+--- myApp/ -----+-- models.py
+---other
Leave this as is the standard setting method. I'm assuming you will use mysql.
settings.py
# Database
DATABASE_ENGINE = 'mysql'
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'xxxx', #Appropriate
'USER': 'xxxx', #Appropriate
'PASSWORD': 'xxxx', #Appropriate
'HOST': 'xxxx', #Appropriate
'PORT': 'xxxx', #Appropriate
'OPTIONS': {}, #If necessary
}
}
SQLALCHEMY_OPTIONS = {} #If you need to configure SQLAlchemy
sqlalchemy needs to set DB when creating session. If you need to create a file called db.py in myProject / myProject and create a session, load this file so that you can create a 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
Basically, alembic DB settings are set from alembic.ini. However, this is inconvenient as it is not referenced from the settings.py file as it is, so set it dynamically with alembic / env.py.
env.py
###Excerpt
import os
import sys
from alembic import context
#If this file is left as it is, settings cannot be read, so pass it through the path.
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
#Set URL
url = str(db_url())
config.set_main_option("sqlalchemy.url", url)
Recommended Posts