search
LoginSignup
69

More than 3 years have passed since last update.

posted at

[Django]既存のデータベースを利用する方法

この記事について

Djangoから既存のデータベースを利用する方法のメモです。
既存システムの管理ツールをDjangoで開発するという状況を想定しています。

参考:公式 レガシーなデータベースと Django の統合

Djangoで利用できるデータベース

Djangoで利用可能なデータベースサーバは公式でPostgresSQL、MySQL、Oracle、非公式でSQLServerをサポートしています。メジャーどころは抑えていますが、バージョンに制限があるので注意しましょう。

※バージョン Django 2.1 時点

データベース バージョン
PostgreSQL 9.4 以上
Oracle 12.1 以上
MySQL 5.6 以上
SQLServer 2008 以上

注意すべき点

Djangoの起動にはいくつかの管理用テーブル(名前がauthとかdjangoで始まるテーブル)が必要になるため、既存のデータベースに全く手を加えず使うことはできません。Djangoが使用する接続ユーザーにはテーブルの作成権限を付けて、マイグレーションを実行できるようにする必要があります。

マイグレーション時に作られるDjango用のテーブルは10数個です。
管理面で気になるなら、事前にDjango用のスキーマを作ってそこに作成されるようにしましょう。既存システムのテーブルも、あらかじめそこにエイリアスを作り最低限の権限を与えておけば安全です。

なお、Djangoでは主キーが無いテーブル、主キーが複合キーであるテーブルは利用できません。

作業内容

1.データベースに接続する

まず各データベースへの接続に必要なライブラリをpipでインストールします。

データベース バージョン
PostgreSQL psycopg2
MySQL mysqlclient
Oracle cx_Oracle
SQLServer django-pyodbc-azure

SQLServerを利用する場合はOSにODBCドライバもインストールします。

※ ODBCドライバはLinux向けもあります。
参考: LinuxからSQL ServerにODBCで接続する

その後settings.pyのDATABASESを修正します。

例:postgres

settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'mydatabase',
        'USER': 'mydatabaseuser',
        'PASSWORD': 'mypassword',
        'HOST': '127.0.0.1',
        'PORT': '5432', 
    }
}

例:SQLServer ODBCの設定が必要

settings.py

DATABASES = {
    'default': {
        'ENGINE': 'sql_server.pyodbc',
        'NAME': 'mydb',
        'USER': 'user@myserver',
        'PASSWORD': 'password',
        'HOST': 'myserver.database.windows.net',
        'PORT': '',

        'OPTIONS': {
            'driver': 'ODBC Driver 13 for SQL Server',
        },
    },
}

設定がうまくいったかどうかは管理コマンドmanage.py dbshellでわかります。

2.inspectdbでモデル定義のコードを調べる

Djangoには既存テーブルを読み取ってモデル定義を作るための管理コマンドがあります。

usage: manage.py inspectdb [-h] [--database DATABASE] [--include-views]
                           [--version] [-v {0,1,2,3}] [--settings SETTINGS]
                           [--pythonpath PYTHONPATH] [--traceback]
                           [--no-color]
                           [table [table ...]]

ここで出力されたコードをmodels.pyに定義します。

models.py
class SampleItem(models.Model):
    id = models.IntegerField(primary_key=True)  # AutoField?
    name = models.CharField(max_length=15)

    class Meta:
        managed = False
        db_table = 'sample'

データの追加を行うテーブルである場合、idの定義をIntegerFieldからAutoFieldに変更する必要があります。

class Meta: 以降では以下の設定をしています。

  • managed = False: migrationsの管理対象外とする
  • db_table = 'sample': テーブル名を明示

参考:のぶLab. Djangoで既存のデータベースを使う

3.マイグレーション

モデルの定義が済んだらマイグレーションを実行します。対象のデータベースにDjangoの管理テーブルが作成されます。

既存テーブルのデータにアクセスは、manage.py shellより既存テーブルのモデル名.objects.first()などを実行して確認しましょう。

あとは問題なくmanage.py runserverでアプリケーションが起動ができるはずです。

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
What you can do with signing up
69