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

相关推荐
Viktor_Ye10 分钟前
高效集成易快报与金蝶应付单的方案
java·前端·数据库
努力算法的小明1 小时前
SQL 复杂查询
数据库·sql
斗-匕1 小时前
MySQL 三大日志详解
数据库·mysql·oracle
代码中の快捷键1 小时前
MySQL数据库存储引擎
数据库·mysql
只因在人海中多看了你一眼1 小时前
数据库体系
数据库
尘浮生1 小时前
Java项目实战II基于微信小程序的电影院买票选座系统(开发文档+数据库+源码)
java·开发语言·数据库·微信小程序·小程序·maven·intellij-idea
六月闻君2 小时前
MySQL 报错:1137 - Can‘t reopen table
数据库·mysql
SelectDB技术团队2 小时前
兼顾高性能与低成本,浅析 Apache Doris 异步物化视图原理及典型场景
大数据·数据库·数据仓库·数据分析·doris
inventecsh2 小时前
mongodb基础操作
数据库·mongodb
白云如幻2 小时前
SQL99版链接查询语法
数据库·sql·mysql