Django4.X适配达梦数据库

一、介绍

  • Django是基于Python的Web应用程序框架,django_dmPython是DM提供的Django连接DM数据库的驱动。
  • Django_dmPython可以运行在任何安装了python的平台上,直接使用源码进行编译安装
  • 达梦提供Django驱动Django_dmPython,版本3.0.1,是基于Django实现的驱动,适用于Django3.1、Django3.2、Django4.0、Django4.1系列。

二、编译Dm的Python相关驱动

Dm的Python的驱动包都在安装目录(D:\dmdbms\drivers\python)下, 根据用到的django版本选择不同的django_dmPythonX.0.0的安装包

在安装django_dmPythonX.0.0的安装包前需要先安装dmPython包

编译安装dmPython

powershell 复制代码
# 方法一: 可查看目录下的readme.txt文本,windows和linux也可以直接使用源码安装,这里的话本地不安装达梦库可能会报很多错,请查看博客其他的文章
# 操作如下:
1.进入到dmPython源码所在目录(setup.py文件所在路径)
2.执行命令:python setup.py install

# 方法二: pip_search dmPython 进行安装,这里不建议使用这种,最好还是使用数据库下相同版本的数据库驱动
PS D:\Python\Python39> pip_search dmPython
                         🐍 https://pypi.org/search/?q=dmPython 🐍
┌────────────────────┬──────────────────┬────────────┬────────────────────────────────────┐
│ Package            │ Version          │ Released   │ Description                        │
├────────────────────┼──────────────────┼────────────┼────────────────────────────────────┤
│ 📂 dmPython        │ 8.1.2.98 > 2.4.9 │ 28-04-2022 │ Python interface to Dameng         │
│ 📂 django-dmPython │ 3.1.7 > 3.0.1    │ 28-04-2022 │ Dameng database backend for Django │
└────────────────────┴──────────────────┴────────────┴────────────────────────────────────┘

编译安装django_dmPythonX.0.0

powershell 复制代码
# 方法一: 可查看目录下的readme.txt文本,windows和linux也可以直接使用源码安装,操作如下:
1.进入到django_dmPython3.0.0源码所在目录(setup.py文件所在路径)
2.执行命令:python setup.py install

# 方法二: pip_search dmPython 进行安装,这里不建议使用这种,最好还是使用数据库下相同版本的数据库驱动
PS D:\Python\Python39> pip_search django_dmPython
│ django-dmPython                  │ 3.1.7 > 3.0.1           │ 28-04-2022 │ Dameng database backend for Django
│ dmPython                         │ 8.1.2.98 > 2.4.9        │ 28-04-2022 │ Python interface to Dameng

三、安装及部署django框架

安装django框架

shell 复制代码
## 安装django框架
$ pip install  django==4.1.0
## 查询安装的相关版本,注:使用 pip serch里面的版本可能会出现项目运行报错的情况
$ pip list
Package                   Version
------------------------- ---------
Django                    4.1
django-dmPython           3.0.1
dmpython                  2.4.9

PyCharm版本新建版本


修改settings.py文件

  • 在INSTALLED_APPS属性中新增创建的应用模块
  • 修改DATABASES属性的达梦的连接信息
python 复制代码
#在INSTALLED_APP属性中新增应用模块,默认会自己创建
INSTALLED_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
    ##新增应用模块
    'dameng_conn.apps.DamengConnConfig',
]

# 将原来默认的sqlite的连接串去掉 换成达梦的信息
# DATABASES = {
#     "default": {
#         "ENGINE": "django.db.backends.sqlite3",
#         "NAME": BASE_DIR / "db.sqlite3",
#     }
# }

DATABASES = {
    'default': {
        'ENGINE': 'django_dmPython',
        'NAME': 'DAMENG',
        'USER': 'SYSDBA',
        'PASSWORD': 'SYSDBA',
        'OPTIONS': {'schema': 'DJANGGO'},
        'HOST': '10.15.1.18',
        'PORT': '5236',
    }
}

应用模块修改views.py

进入 dameng_conn/views.py 文件创建视图:

python 复制代码
from django.shortcuts import render
from django.http import HttpResponse

# Create your views here.
def applist(request):
    return HttpResponse("Hello, DM Database")

应用模块新建urls.py

进入 dameng_conn/views.py 文件设置应用访问路由:

python 复制代码
from . import views
from django.urls import path
## 设置应用访问路由

urlpatterns = [
    path('', views.applist, name='listapp'),
]

修改主模块的urls.py

python 复制代码
from django.contrib import admin
from django.urls import path,include

urlpatterns = [
    path("admin/", admin.site.urls),
    path('dameng_conn/', include('dameng_conn.urls')),
]

四、创建模型+验证

创建模型

Django 作为 web 开发框架,其内部已经包含有 ORM(object relational mapping)组件,在创建好模型后,对应模块将对象属性值转换成相应的SQL语句自动在数据库中执行,此时的类属性就相当于表字段。

python 复制代码
from django.db import models

# Create your models here.
from django.db import models

# Create your models here.
from django.db import models


class Menu(models.Model):
    name = models.CharField('英文名', max_length=255, unique=True)
    label = models.CharField('中文名', max_length=255)
    parent = models.ForeignKey(to='self', on_delete=models.CASCADE, verbose_name='上级菜单', blank=True, null=True)

    class Meta:
        verbose_name = '菜单'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name


class Department(models.Model):
    name = models.CharField('名字', max_length=64)
    order_no = models.IntegerField('排序', default=100, help_text='小的排前面')
    remark = models.CharField('备注', max_length=256, blank=True, null=True)
    status = models.BooleanField('状态', choices=((True, '启用'), (False, '停用')), default=True)
    parent = models.ForeignKey(to='self', on_delete=models.CASCADE, verbose_name='上级部门', blank=True, null=True)
    create_time = models.DateTimeField('创建时间', auto_now_add=True)

    # 递归展示部门名字
    def recursive_name_function(self, mi, temp=''):
        """
        recursive name
        :param mi: model instance
        :param temp: temporary name(do not pass this parameter !!!)
        :return: recursive name
        """
        return self.recursive_name_function(mi.parent, f'/{mi.name}{temp}') if mi.parent else f'{mi.name}{temp}'

    def recursive_name(self):
        return self.recursive_name_function(self)

    recursive_name.short_description = '名字'

    class Meta:
        verbose_name = '部门'
        verbose_name_plural = verbose_name
        ordering = ['-status', 'order_no']

    def __str__(self):
        return self.name


# Create your models here.
class MyProject(models.Model):
    # 项目表:
    table_name = models.AutoField(primary_key=True, db_column='MY_PROJECT_INFO')
    # 项目编号:
    project_id = models.IntegerField(null=True)
    # 项目名称:
    project_name = models.CharField(max_length=100)
    # 项目地址:
    project_address = models.CharField(max_length=200)
    # 项目联系人姓名:
    project_contact = models.CharField(max_length=200)
    # 项目联系人电话:
    phone_number = models.CharField(max_length=200)
    # 项目描述:
    project_description = models.TextField(null=True)
    # 操作系统版本:
    os_version = models.CharField(max_length=200)
    # CPU核数:
    cpu_num = models.IntegerField(null=True)
    # 内存大小:
    memory_size = models.IntegerField(null=True)
    # 磁盘大小:
    disk_size = models.IntegerField(null=True)

    # 表名:
    class Meta:
        db_table = 'MY_PROJECT_INFO'


class Role(models.Model):
    name = models.CharField(max_length=100)

    def __str__(self):
        return self.name


class CustomUser(models.Model):
    # 项目表:
    userid = models.AutoField(primary_key=True)
    username = models.CharField(max_length=100, unique=True, verbose_name='用户名')
    remark = models.CharField(verbose_name='备注', max_length=256, blank=True, null=True)
    nickname = models.CharField(verbose_name='昵称', max_length=64, blank=True, null=True)
    role = models.ForeignKey(Role, on_delete=models.CASCADE, related_name='users', related_query_name='user', null=True)

    def __str__(self):
        return self.username

    # 表名:
    class Meta:
        db_table = 'ACCOUNTS_CUSTONUSER'

新增数据_init_data.py

dameng_conn/management/commands/init_data.py

python 复制代码
from dameng_conn.models import Role, CustomUser
from django.core.management.base import BaseCommand


class Command(BaseCommand):
    help = 'Initialize roles and users'

    def handle(self, *args, **options):
        # 初始化角色
        roles = ['Admin', 'User', 'Guest']
        for role in roles:
            Role.objects.create(name=role)

        # 初始化用户
        users = [
            {
                'username': 'admin',
                'remark': 'Administrator',
                'nickname': 'Admin',
                'role_name': 'Admin'
            },
            {
                'username': 'john',
                'remark': 'Regular User',
                'nickname': 'John',
                'role_name': 'User'
            }
        ]
        for user_data in users:
            role_name = user_data.pop('role_name')
            role = Role.objects.get(name=role_name)
            CustomUser.objects.create(role=role, **user_data)

        self.stdout.write(self.style.SUCCESS('Roles and users initialized successfully.'))

迁移表结构

shell 复制代码
PS E:\PythonCode\djangoProject> python manage.py makemigrations dameng_conn
Migrations for 'dameng_conn':
dameng_conn\migrations\0001_initial.py
- Create model MyProject
- Create model Role
- Create model Menu
- Create model Department
- Create model CustomUser

PS E:\PythonCode\djangoProject> python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, dameng_conn, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying auth.0012_alter_user_first_name_max_length... OK
Applying dameng_conn.0001_initial... OK
Applying sessions.0001_initial... OK
PS E:\PythonCode\djangoProject> 

Django的makemigrations和migrate命令只负责数据库结构的迁移,而不涉及数据的初始化。

python manage.py makemigrations和python manage.py migrate是Django的管理命令,用于执行数据库迁移操作。

  • **python manage.py makemigrations命令用于生成迁移文件。**它会检测你对模型的更改,并自动生成包含这些更改的迁移文件。迁移文件包含了与更改相关的操作指令,比如创建、修改或删除表、字段等。执行该命令后,Django会对应地生成一个迁移文件,但并不真正修改数据库结构。
  • python manage.py migrate命令用于应用迁移。执行该命令后,Django会读取迁移文件,并根据其中的操作指令来更新数据库结构。如果之前没有执行过migrate命令,它会创建数据库,并将所有迁移应用到数据库中。如果之前已经执行过migrate命令,它会检查之前已经应用的迁移,并将新的迁移应用到数据库中,同步数据库结构。

通过运行这两个命令,你可以将在models.py中对数据库的改变应用到实际的数据库中。首先,运行python manage.py makemigrations命令来生成迁移文件,然后再运行python manage.py migrate命令将这些改变应用到数据库中。

初始化数据

shell 复制代码
PS E:\PythonCode\djangoProject> python manage.py init_data
Roles and users initialized successfully.
  • 在创建数据库表结构之后,预先插入一些默认的数据,可以通过自定义管理命令来实现
  • Django项目的根目录下创建一个名为management的文件夹。然后,在该文件夹下创建一个名为commands的文件夹。最后,在commands文件夹下创建一个Python脚本文件,例如init_role.py,并编写初始化角色数据的逻辑。

五、表结构确认

六、资料包

链接:https://pan.baidu.com/s/1fF5DXJ4hTF-wlkByghPvyw?pwd=lwy4 提取码:lwy4

相关推荐
Channing Lewis21 分钟前
sql server如何创建表导入excel的数据
数据库·oracle·excel
秃头摸鱼侠21 分钟前
MySQL安装与配置
数据库·mysql·adb
UGOTNOSHOT26 分钟前
每日八股文6.3
数据库·sql
行云流水行云流水1 小时前
数据库、数据仓库、数据中台、数据湖相关概念
数据库·数据仓库
John Song1 小时前
Redis 集群批量删除key报错 CROSSSLOT Keys in request don‘t hash to the same slot
数据库·redis·哈希算法
IvanCodes1 小时前
七、Sqoop Job:简化与自动化数据迁移任务及免密执行
大数据·数据库·hadoop·sqoop
tonexuan1 小时前
MySQL 8.0 绿色版安装和配置过程
数据库·mysql
JohnYan1 小时前
工作笔记- 记一次MySQL数据移植表空间错误排除
数据库·后端·mysql
我最厉害。,。2 小时前
Windows权限提升篇&数据库篇&MYSQL&MSSQL&ORACLE&自动化项目
数据库·mysql·sqlserver
远方16092 小时前
20-Oracle 23 ai free Database Sharding-特性验证
数据库·人工智能·oracle