この記事について
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
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'mydatabase',
'USER': 'mydatabaseuser',
'PASSWORD': 'mypassword',
'HOST': '127.0.0.1',
'PORT': '5432',
}
}
例:SQLServer ODBCの設定が必要
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に定義します。
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'
: テーブル名を明示
3.マイグレーション
モデルの定義が済んだらマイグレーションを実行します。対象のデータベースにDjangoの管理テーブルが作成されます。
既存テーブルのデータにアクセスは、manage.py shell
より既存テーブルのモデル名.objects.first()
などを実行して確認しましょう。
あとは問題なくmanage.py runserver
でアプリケーションが起動ができるはずです。