[PYTHON] Paramètres de base de données lors de l'utilisation de Django + SQLAlchemy + Alembic

L'ORM standard de Django peut être rapide et vous voudrez peut-être utiliser SQL Alchemy. Cependant, la migration de SQLAlchemy n'est pas non plus très bonne, donc j'aimerais utiliser Alembic à la place.

Comme chacun est un module indépendant, chaque DB est défini de manière différente. Comme il est difficile de les écrire séparément, SQL Alchemy et Alembic se réfèrent aux paramètres Django.

organisation des fichiers

Tout d'abord, supposons la structure de fichiers suivante.

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

Paramètres Django

Laissez ceci tel quel est la méthode de réglage standard. Il est censé utiliser mysql.

settings.py


# Database
 
DATABASE_ENGINE = 'mysql'
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'xxxx',      #Approprié
        'USER': 'xxxx',      #Approprié
        'PASSWORD': 'xxxx',  #Approprié
        'HOST': 'xxxx',      #Approprié
        'PORT': 'xxxx',      #Approprié
        'OPTIONS': {},       #Si nécessaire
    }
}
 
SQLALCHEMY_OPTIONS = {} #Si vous devez configurer SQLAlchemy

Paramètres de SQL Alchemy

sqlalchemy doit définir DB lors de la création d'une session. Si vous devez créer un fichier appelé db.py dans myProject / myProject et créer une session, chargez ce fichier afin de pouvoir créer une 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

Fondamentalement, les paramètres de la base de données d'alambic sont définis à partir d'alembic.ini. Cependant, cela n'est pas pratique car il n'est pas référencé à partir du fichier settings.py tel quel, il est donc défini dynamiquement dans alembic / env.py.

env.py


###Extrait
import os
import sys
  
from alembic import context
  
#Si ce fichier est laissé tel quel, les paramètres ne peuvent pas être lus, alors passez-le par le chemin.
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
 
#Définir l'URL
url = str(db_url())
config.set_main_option("sqlalchemy.url", url)

Recommended Posts

Paramètres de base de données lors de l'utilisation de Django + SQLAlchemy + Alembic
Paramètres de DEBUG lors de l'utilisation de Django
Migration SQLAlchemy + DB par Alembic
Traitement des insertions de table DB à l'aide de sqlalchemy
[Django] Paramètre pour envoyer des e-mails avec postfix
Configuration initiale de django
Paramètres lors de l'utilisation de Jupyter Notebook sous un serveur proxy
Paramètres de proxy lors de l'utilisation de pip ou de Jupyter Notebook
Paramètres Django + MySQL
Paramètres d'URL de Django
Résumé lors de l'utilisation de Fabric
Essayez d'utiliser Django templates.html
Paramètres d'achèvement de la commande Django
Précautions lors de l'utilisation de Chainer
Remarques sur l'utilisation d'Alembic
Éliminez les erreurs qui se produisent lors de l'utilisation de Django REST Swagger avec Django 3.0
Comment résoudre la protection CSRF lors de l'utilisation d'AngularJS avec Django