この記事では、Django 6.0 から、マイクロソフト Access のデータベースファイル(.accdbファイル)を操作しております。
django-msaccess パッケージを使います。settings.py の DATABASES の変更が必要です。
DATABASES = {
'default': {
'ENGINE': 'django-msaccess',
'ODBC': '{Microsoft Access Driver (*.mdb, *.accdb)}',
'PATH': 'C:\\Work\\MyNewDatabase.accdb(Accessデータベースファイルのフルパス)',
'DEBUG': False,
'TRUNCATENAME': True,
},
}
このような設定にしてください。
2026年1月19日に、django-msaccessパッケージを更新しました。バージョン0.2.0になります。
初期リリース(0.1.1)では、Djangoスタンドアロン形式プログラムから、レコードの全部削除ができませんでした。Person.objects.all().delete()が落ちます。パッケージを修正しました。お手元のパッケージの更新をお願いします。pip install -U django-msaccess を実行します。
インストール編の記事
モデル操作編その1
上記の記事を必要に応じて、ご参照下さい。
1.はじめに
前回の記事(モデル操作編その1)では、マイクロソフト Access に登録するレコードを、キーボード入力によって行いました。入力間違い等が発生し、大変だったかもしれません。
Accessに登録するレコードを、事前にPythonスクリプトに書いておき、それを実行したいというご要望が多くあったと思います。そこで今回の記事ではモデル操作の知識を深める予定を変更して、前回記事の内容を、Pythonスクリプトで実行する例を示します。
今回の記事を通して、AccessのデータベースをPythonスクリプトからいろいろな場面で操作できることを実感すると思いますが、Accessに対する接続パッケージ(django-msaccess)は、ODBC経由でAccess側に投入されるSQL文を、Python正規化表現等を使ってエラーが発生しないように事前に書き換え処理を行います。その処理のためにパフォーマンスが悪くなります。
同時接続が少人数の運用であればパフォーマンス上の問題は発生しないかもしれませんが、あくまでも Django の学習用としてお使いください。
一番良い方法は、今運用しているファイル共有型の Access の利用方法の中に、Django を加えて、Webからのアクセスを入れたら全体的なパフォーマンスがどのように変化するかを、検証するのが良いでしょう。そして、データベース本体を Access から SQLServer などに交換します。
Django の利用では、できるかぎりSQL文は直接記述しない! という方針が維持できれば、データベースの変更がすぐにできます。目指す場所は、マイクロソフトの Azure App Service です(他のクラウドサービスでもOK!)。
2.スタンドアロンで動かす、Django を利用したプログラムの作り方
Django のシステムは、Webアプリケーションのフレームワークなので、通常は、Webアプリケーションサーバーから呼び出されて実行されます。このような通常の運用とは異なり、WindowsやLinuxなどのOS上のコマンドプロンプト(OSのシェル)から、Pythonプログラムファイルを実行する形式を、ここでは「スタンドアロン」と呼び、Webアプリケーションとして動作する Django と区別します。ここでは、スタンドアロン形式で動作する Django プログラムの作り方の解説をしますので、ほんの一部分だけ、スタンドアロン形式のプログラムでは絶対に必要となる記述があります。その内容は、Webアプリケーションとして動作するときの Django では不要です(記述してはダメ!)。この点を押さえておきます。
2.1 スタンドアロン形式プログラムの、Djangoシステムの初期化処理
プログラムの冒頭箇所で、Django システムを初期化する命令を記述します。この初期化命令は、スタンドアロン形式プログラムの大きな特徴です。
Django の初期化を行うのは、何だか大変そうだな~、というイメージがありますが、次の4行だけです。この4行を入れれば、おしまい!
import os
import django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'DJLearn.settings')
django.setup()
3行目は、OSの環境変数が存在しない時のデフォルト値を登録します。
環境変数名 DJANGO_SETTINGS_MODULE が未登録の時の、その初期値を定義します。
4行目が、Djangoシステムの初期化処理です。
こんな単純であれば、私にもDjangoプログラムが作れそう! と、お感じになりませんか?
3行目について詳しく見ると、環境変数 DJANGO_SETTINGS_MODULE に登録する内容は、settings.py ファイルのモジュール読み込み定義を書きます。
DJLearnは、フォルダ名です。
この事例では、manage.pyファイルが存在する場所と同じ場所に、スタンドアロンプログラムを設置しています。
manage.pyファイルのフルパス表記は、
C:\Work\DJLearn\manage.py
となっています。
また、settings.pyファイルのフルパス表記は、
C:\Work\DJLearn\DJLearn\settings.py
となっています。
manage.pyファイルと同じ場所にDjangoスタンドアロンプログラムファイルを保存する場合は、同じ場所に存在する DJLearn フォルダの中に settings.py が見つかりますので、
'DJLearn.settings'
となります。親側の同じ名前の DJLearn とは違いますので、ご注意を。わかりにくいフォルダ構成にしてしまい申し訳ありませんでした。
(venv) C:\Work\DJLearn>dir
2026/01/14 11:47 <DIR> .
2026/01/14 11:47 <DIR> ..
2026/01/09 15:07 <DIR> DJLearn
2026/01/09 15:43 <DIR> L01
2026/01/09 15:05 685 manage.py
2026/01/14 11:50 391 MyDjangoProg.py
(venv) C:\Work\DJLearn>dir DJLearn
2026/01/09 15:07 <DIR> .
2026/01/09 15:07 <DIR> ..
2026/01/09 15:05 407 asgi.py
2026/01/13 16:35 3,469 settings.py
2026/01/09 15:05 785 urls.py
2026/01/09 15:05 407 wsgi.py
2026/01/09 15:05 0 __init__.py
2026/01/13 16:35 <DIR> __pycache__
上記の MyDjangoProg.py ファイルがスタンドアロンプログラムです。
このファイルの冒頭が、
import os
import django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'DJLearn.settings')
django.setup()
となっています。
Djangoプロジェクトの新規登録処理を、以下のような手順で登録をすると、ディレクトリ構成がわかりやすくなります。
(1)Djangoの複数のプロジェクトを保存するプロジェクトルートのディレクトリを作成しておきます。
mkdir C:\DjangoProjects
(2)カレントディレクトリを、プロジェクトルートにします。
cd /d C:\DjangoProjects
(3)これから新規登録を行うプロジェクト(MyLearnProject)のディレクトリを作成します。
mkdir MyLearnProject
(4)カレントディレクトリがプロジェクトルートにある状態で、次のDjangoプロジェクトの新規登録を実行します
django-admin.exe startproject conf MyLearnProject
このように実行すると、MyLearnProjectプロジェクトの中に、confディレクトリが作成され、その中にsettings.pyなどのファイルが作成されます。このconfは、confアプリの名前です。設定用のconfigurationのconfです。
Djangoのプロジェクトの新規登録方法は、(2)(3)(4)を繰り返します。
2.2 スタンドアロン形式プログラムが、別の場所に設置されたとき
2.1では、スタンドアロン形式のプログラム MyDjangoProg.py は、Djangoのシステム管理設定ファイル manage.py と同じ場所に設置した例です。実際の運用では、スタンドアロン形式のプログラムは、manage.pyとは異なる場所に、保存すると思います。この場合は、このDJLearn.settingsモジュールファイルを検索できるように事前登録が必要になります。Pythonのモジュール検索パスの登録の仕組みに従います。
2.2.1 環境変数PYTHONPATHを登録する方法
環境変数 PYTHONPATH を登録する方法があります。
(venv) C:\work2>set PYTHONPATH=C:\Work\DJLearn
(venv) C:\work2>python MyDjangoProg.py
スタンドアロンプログラムファイルが、C:\Work2 の中に設置された場合は、manage.pyファイルのパス部分(C:\Work\DJLearn)を、環境変数PYTHONPATHに登録してから、プログラムを実行します。
2.2.2 プログラムの中に、検索パスを記述する方法
1度設置したスタンドアロンプログラムのファイルを、どこにも移動させないのであれば、モジュールの検索パスを、プログラムの中に埋め込む方法があります。
import os
import sys
# C:\Work\DJLearn を検索パスの先頭に追加
sys.path.insert(0, "C:\\Work\\DJLearn")
import django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'DJLearn.settings')
django.setup()
2.2.3 site-packagesの中に、パス設定ファイルを登録する方法(*.pthファイルの設置)
自分が管理しているパソコン(またはサーバー)であれば、Python言語をインストールしたときに作成される、site-packagesフォルダの中に、モジュール検索パスを登録したパス設定ファイル(*.pth、ファイルの名前は任意)を設置する方法もあります。特にこの記事のように、Pythonの仮想環境を構築して運用しているのであれば、C:\Work\venv\Lib\site-packages この場所の中に次のファイルを設置します。
ファイルの中に、検索パスを行単位で登録します。
C:\Work\DJLearn
3. スタンドアロン形式プログラムを使って Access データベースを操作しましょう
3.1 レコードの削除
前回作成したPersonテーブルに登録されているレコードを全部削除しましょう。次のスクリプトを実行します。スクリプトは、別の場所(C:\Work2)に保存しています。
#
# Initialize the Django.
#
import os
import sys
# C:\Work\DJLearn を検索パスの先頭に追加
sys.path.insert(0, "C:\\Work\\DJLearn")
import django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'DJLearn.settings')
django.setup()
#
# User programs start here.
#
from L01.models import Person
deleted_count, details = Person.objects.all().delete()
print(f'deleted_count={deleted_count}')
print(f"details={details}")
print(Person.objects.all().values_list('first_name','last_name'))
(venv) C:\work2>python MyDjangoProg.py
deleted_count=6
details={'L01.Person': 6}
<QuerySet []>
deleted_countは、削除されたレコードの総数が代入されます。
detailsは、削除されたレコードのモデルごとの内訳件数が返されます。
カスケード削除(連鎖削除)が行われた場合の件数がわかります。
例えば、次回以降で触れますが、
deleted_count, details = CP.objects.get(cp_no='CP01').delete()
print(f'deleted_count={deleted_count}')
print(f"details={details}")
このような削除命令を実施したときに、コンソールに、
deleted_count=5
details={'L01.PS': 4, 'L01.CP': 1}
と表示されます。CPテーブルから1レコード、PSテーブルから4件削除されたことがわかります。
3.2 レコードの登録
前回の「8.レコードを登録してみよう」で、キーボードから入力した内容を、スクリプトにしましょう。まず最初に、入力した内容をそのままスクリプトにします。ファイルの内容は以下の通りです。
#
# Initialize the Django.
#
import os
import sys
# C:\Work\DJLearn を検索パスの先頭に追加
sys.path.insert(0, "C:\\Work\\DJLearn")
import django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'DJLearn.settings')
django.setup()
#
# User programs start here.
#
from L01.models import Person
member=Person()
member.first_name='家康'
member.last_name='徳川'
member.save()
del member
member=Person()
member.first_name='秀忠'
member.last_name='徳川'
member.save()
del member
member=Person()
member.first_name='家光'
member.last_name='徳川'
member.save()
del member
Person(first_name='家綱', last_name='徳川').save()
Person(first_name='綱吉', last_name='徳川').save()
Person(first_name='家宣', last_name='徳川').save()
print(f'Person={Person.objects.all().values_list('first_name','last_name')}')
上記のプログラムを実行すると、
(venv) C:\work2>python insert-1.py
Person=<QuerySet [('家康', '徳川'), ('秀忠', '徳川'), ('家光', '徳川'), ('家綱', '徳川'), ('綱吉', '徳 川'), ('家宣', '徳川')]>
となります。
もう少し、かっちょいい! プログラムにしてみましょう。
#
# Initialize the Django.
#
import os
import sys
# C:\Work\DJLearn を検索パスの先頭に追加
sys.path.insert(0, "C:\\Work\\DJLearn")
import django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'DJLearn.settings')
django.setup()
#
# User programs start here.
#
from L01.models import Person
TokugawaFamily = ['家康','秀忠','家光','家綱','綱吉',
'家宣','家継','吉宗','家重','家治',
'家斉','家慶','家定','家茂','慶喜']
for name in TokugawaFamily:
member = Person()
member.first_name = name
member.last_name = '徳川'
member.save()
print(f'Person={Person.objects.all().values_list('id', 'first_name')}')
上記のプログラムを実行すると、
(venv) C:\work2>python insert-2.py
Person=<QuerySet [(1, '家康'), (2, '秀忠'), (3, '家光'), (4, '家綱'), (5, '綱吉'), (6, '家宣'), (7, '家継'), (8, '吉宗'), (9, '家重'), (10, '家治'), (11, '家斉'), (12, '家慶'), (13, '家定'), (14, '家茂'), (15, '慶喜')]>
となります。
3.3 レコードの検索
キーボードから入力した内容を、そのままファイルに書き出します。但し、ファイルの冒頭に、Djangoの初期化処理を忘れずに書いてください。
「9.1 filterメソッド」で入力した内容をそのまま書きます。print命令が無い箇所には、追加してください。
#
# Initialize the Django.
#
import os
import sys
# C:\Work\DJLearn を検索パスの先頭に追加
sys.path.insert(0, "C:\\Work\\DJLearn")
import django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'DJLearn.settings')
django.setup()
#
# User programs start here.
#
from L01.models import Person
print(Person.objects.filter(first_name='家康'))
member=Person.objects.filter(first_name='家康')
print(member)
print(member.values_list())
上記のプログラムを実行すると、
(venv) C:\work2>python search-1.py
<QuerySet [<Person: Person object (1)>]>
<QuerySet [<Person: Person object (1)>]>
<QuerySet [(1, '家康', '徳川')]>
となります。
3.4 レコードの検索(AND条件)
「9.2 AND条件」で入力した内容をそのまま書きます。
#
# Initialize the Django.
#
import os
import sys
# C:\Work\DJLearn を検索パスの先頭に追加
sys.path.insert(0, "C:\\Work\\DJLearn")
import django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'DJLearn.settings')
django.setup()
#
# User programs start here.
#
from L01.models import Person
print(Person.objects.filter(first_name='家康', last_name='徳川'))
print(Person.objects.filter(first_name='家康', last_name='徳川').values_list())
member=Person.objects.filter(first_name='家康', last_name='山川')
print(member.values_list())
上記のプログラムを実行すると、
(venv) C:\work2>python search-2.py
<QuerySet [<Person: Person object (1)>]>
<QuerySet [(1, '家康', '徳川')]>
<QuerySet []>
となります。
3.5 レコードの検索(OR条件)
「9.3 OR条件」で入力した内容をそのまま書きます。
#
# Initialize the Django.
#
import os
import sys
# C:\Work\DJLearn を検索パスの先頭に追加
sys.path.insert(0, "C:\\Work\\DJLearn")
import django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'DJLearn.settings')
django.setup()
#
# User programs start here.
#
from L01.models import Person
from django.db.models import Q
members=Person.objects.filter( Q(first_name='家康') | Q(first_name='家宣') )
print(members.values_list())
上記のプログラムを実行すると、
(venv) C:\work2>python search-3.py
<QuerySet [(1, '家康', '徳川'), (6, '家宣', '徳川')]>
となります。
3.6 レコードの検索(残りの条件)
「9.4 より大きい、以上(等号が入る)、の検索」以降の内容を1つのファイルにします。
#
# Initialize the Django.
#
import os
import sys
# C:\Work\DJLearn を検索パスの先頭に追加
sys.path.insert(0, "C:\\Work\\DJLearn")
import django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'DJLearn.settings')
django.setup()
#
# User programs start here.
#
from L01.models import Person
from django.db.models import Q
members=Person.objects.filter(id__gt=3)
print(members.values_list())
members=Person.objects.filter(pk__gt=3)
print(members.values_list())
members=Person.objects.filter(id__gte=4)
print(members.values_list())
bar='-'*40
print(bar)
print('** lt, lte **')
members=Person.objects.filter(id__lt=3)
print(members.values_list())
members=Person.objects.filter(id__lte=4)
print(members.values_list())
print(bar)
print('** in **')
members=Person.objects.filter(id__in=[ 1, 3, 5 ])
print(members.values_list())
members=Person.objects.filter(first_name__in=[ '秀忠', '家綱', '家宣' ])
print(members.values_list())
print(bar)
print('** contains **')
members=Person.objects.filter(first_name__contains='家')
print(members.values_list())
members=Person.objects.filter( Q(first_name__contains='家') | Q(first_name__contains='吉') )
print(members.values_list())
print(bar)
print('** order_by **')
print(Person.objects.filter(first_name__in=[ '秀忠', '家綱', '家宣' ]).order_by('first_name').values_list())
print(Person.objects.filter(first_name__in=[ '秀忠', '家綱', '家宣' ]).order_by('-first_name').values_list())
members=Person.objects.filter(first_name__contains='家').order_by('-id')
print(members.values_list())
上記のプログラムを実行すると、
(venv) C:\work2>python search-4.py
** gt, gte **
<QuerySet [(4, '家綱', '徳川'), (5, '綱吉', '徳川'), (6, '家宣', '徳川'), (7, '家継', '徳川'), (8, '吉 宗', '徳川'), (9, '家重', '徳川'), (10, '家治', '徳川'), (11, '家斉', '徳川'), (12, '家慶', '徳川'), (13, '家定', '徳川'), (14, '家茂', '徳川'), (15, '慶喜', '徳川')]>
<QuerySet [(4, '家綱', '徳川'), (5, '綱吉', '徳川'), (6, '家宣', '徳川'), (7, '家継', '徳川'), (8, '吉 宗', '徳川'), (9, '家重', '徳川'), (10, '家治', '徳川'), (11, '家斉', '徳川'), (12, '家慶', '徳川'), (13, '家定', '徳川'), (14, '家茂', '徳川'), (15, '慶喜', '徳川')]>
<QuerySet [(4, '家綱', '徳川'), (5, '綱吉', '徳川'), (6, '家宣', '徳川'), (7, '家継', '徳川'), (8, '吉 宗', '徳川'), (9, '家重', '徳川'), (10, '家治', '徳川'), (11, '家斉', '徳川'), (12, '家慶', '徳川'), (13, '家定', '徳川'), (14, '家茂', '徳川'), (15, '慶喜', '徳川')]>
------------------------------------------------------------
** lt, lte **
<QuerySet [(1, '家康', '徳川'), (2, '秀忠', '徳川')]>
<QuerySet [(1, '家康', '徳川'), (2, '秀忠', '徳川'), (3, '家光', '徳川'), (4, '家綱', '徳川')]>
------------------------------------------------------------
** in **
<QuerySet [(1, '家康', '徳川'), (3, '家光', '徳川'), (5, '綱吉', '徳川')]>
<QuerySet [(2, '秀忠', '徳川'), (4, '家綱', '徳川'), (6, '家宣', '徳川')]>
------------------------------------------------------------
** contains **
<QuerySet [(1, '家康', '徳川'), (3, '家光', '徳川'), (4, '家綱', '徳川'), (6, '家宣', '徳川'), (7, '家 継', '徳川'), (9, '家重', '徳川'), (10, '家治', '徳川'), (11, '家斉', '徳川'), (12, '家慶', '徳川'), (13, '家定', '徳川'), (14, '家茂', '徳川')]>
<QuerySet [(1, '家康', '徳川'), (3, '家光', '徳川'), (4, '家綱', '徳川'), (5, '綱吉', '徳川'), (6, '家 宣', '徳川'), (7, '家継', '徳川'), (8, '吉宗', '徳川'), (9, '家重', '徳川'), (10, '家治', '徳川'), (11, '家斉', '徳川'), (12, '家慶', '徳川'), (13, '家定', '徳川'), (14, '家茂', '徳川')]>
------------------------------------------------------------
** order_by **
<QuerySet [(4, '家綱', '徳川'), (6, '家宣', '徳川'), (2, '秀忠', '徳川')]>
<QuerySet [(2, '秀忠', '徳川'), (6, '家宣', '徳川'), (4, '家綱', '徳川')]>
<QuerySet [(14, '家茂', '徳川'), (13, '家定', '徳川'), (12, '家慶', '徳川'), (11, '家斉', '徳川'), (10, '家治', '徳川'), (9, '家重', '徳川'), (7, '家継', '徳川'), (6, '家宣', '徳川'), (4, '家綱', '徳川'), (3, '家光', '徳川'), (1, '家康', '徳川')]>
となります。
3.7 レコードの更新
「11.レコードの更新」の内容を1つのファイルにします。
#
# Initialize the Django.
#
import os
import sys
# C:\Work\DJLearn を検索パスの先頭に追加
sys.path.insert(0, "C:\\Work\\DJLearn")
import django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'DJLearn.settings')
django.setup()
#
# User programs start here.
#
from L01.models import Person
from django.db.models import Q
member=Person.objects.get(first_name='家光', last_name='徳川')
member.last_name='徳川将軍家です'
member.save()
bar='-'*40
print("last_name__contains='将軍'")
member=Person.objects.filter(last_name__contains='将軍')
print(member.values_list())
print(bar)
print("first_name__contains='家'")
members=Person.objects.filter(first_name__contains='家')
for mem in members:
print(mem.first_name)
members=Person.objects.filter(first_name__contains='家')
for mem in members:
mem.first_name = mem.first_name + 'さん'
mem.save()
print(bar)
print("first_name__contains='さ'")
members=Person.objects.filter(first_name__contains='さ')
print(members.values_list())
print(members.values_list('first_name'))
上記のプログラムを実行すると、
(venv) C:\work2>python update.py
last_name__contains='将軍'
<QuerySet [(3, '家光', '徳川将軍家です')]>
----------------------------------------
first_name__contains='家'
家康
家光
家綱
家宣
家継
家重
家治
家斉
家慶
家定
家茂
----------------------------------------
first_name__contains='さ'
<QuerySet [(1, '家康さん', '徳川'), (3, '家光さん', '徳川将軍家です'), (4, '家綱さん', '徳川'), (6, '家宣さん', '徳川'), (7, '家継さん', '徳川'), (9, '家重さん', '徳川'), (10, '家治さん', '徳川'), (11, '家 斉さん', '徳川'), (12, '家慶さん', '徳川'), (13, '家定さん', '徳川'), (14, '家茂さん', '徳川')]>
<QuerySet [('家康さん',), ('家光さん',), ('家綱さん',), ('家宣さん',), ('家継さん',), ('家重さん',), ('家治さん',), ('家斉さん',), ('家慶さん',), ('家定さん',), ('家茂さん',)]>
となります。
3.8 レコードの削除
「12.レコードの削除」の内容を1つのファイルにします。
#
# Initialize the Django.
#
import os
import sys
# C:\Work\DJLearn を検索パスの先頭に追加
sys.path.insert(0, "C:\\Work\\DJLearn")
import django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'DJLearn.settings')
django.setup()
#
# User programs start here.
#
from L01.models import Person
from django.db.models import Q
print(Person.objects.all().values_list('id','first_name'))
bar='-'*40
print(bar)
print("id=3")
mem=Person.objects.get(id=3)
print(mem.delete())
print(Person.objects.all().values_list('id','first_name'))
print(bar)
print("first_name__contains='家'")
print(Person.objects.filter(first_name__contains='家').delete())
print(Person.objects.all().values_list('id','first_name'))
print(bar)
print("秀忠 or 綱吉")
print( Person.objects.filter(Q(first_name='秀忠')|Q(first_name='綱吉')) )
print( Person.objects.filter(Q(first_name='秀忠')|Q(first_name='綱吉')).values_list())
print(Person.objects.filter(Q(first_name='秀忠')|Q(first_name='綱吉')).delete())
print(Person.objects.all())
上記のプログラムを実行すると、
(venv) C:\work2>python delete.py
<QuerySet [(1, '家康'), (2, '秀忠'), (3, '家光'), (4, '家綱'), (5, '綱吉'), (6, '家宣'), (7, '家継'), (8, '吉宗'), (9, '家重'), (10, '家治'), (11, '家斉'), (12, '家慶'), (13, '家定'), (14, '家茂'), (15, '慶喜')]>
----------------------------------------
id=3
(1, {'L01.Person': 1})
<QuerySet [(1, '家康'), (2, '秀忠'), (4, '家綱'), (5, '綱吉'), (6, '家宣'), (7, '家継'), (8, '吉宗'), (9, '家重'), (10, '家治'), (11, '家斉'), (12, '家慶'), (13, '家定'), (14, '家茂'), (15, '慶喜')]>
----------------------------------------
first_name__contains='家'
(10, {'L01.Person': 10})
<QuerySet [(2, '秀忠'), (5, '綱吉'), (8, '吉宗'), (15, '慶喜')]>
----------------------------------------
秀忠 or 綱吉
<QuerySet [<Person: Person object (2)>, <Person: Person object (5)>]>
<QuerySet [(2, '秀忠', '徳川'), (5, '綱吉', '徳川')]>
(2, {'L01.Person': 2})
<QuerySet [<Person: Person object (8)>, <Person: Person object (15)>]>
となります。
4.まとめ
今回は、マイクロソフト Access のデータベースを、スタンドアロン Django スクリプトを使って、プログラムから操作することを学びました。スクリプトファイルの冒頭に、決まり文句の命令を記述すれば、その後は、今まで解説してきたレコードの操作命令をそのまま記述できることが、ご理解頂けると思います。
Python言語には、多くのパッケージモジュールが公開されており、それらを使うことで業務処理のプログラミングを効率的に開発することができると思います。しかしながら、Access で利用しているVBAプログラミング資産が多くのファイルやモジュール形式で存在すると思います。これらのVBAプログラミング資産をPython言語に書き換えると思うと、現実的には無理だと実感するかもしれません。
社内資産を、生成AIに投入し、VBA言語からPython言語に変換することは、生成AIの学習に使われたり、セキュリティ上の問題が発生します。このような場面では、生成AIをまったく使用せずに、VBA言語からPython言語へ変換することが、開発要件として求められます。このあたりの変換技術については、また記事にしていければと考えております。
社内で開発された、マイクロソフト Access のアプリケーション資産を、マイクロソフトAzure App Service のWeb環境に、早く移行させましょう!