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

相关推荐
广州智造4 小时前
OptiStruct实例:3D实体转子分析
数据库·人工智能·算法·机器学习·数学建模·3d·性能优化
技术宝哥7 小时前
Redis(2):Redis + Lua为什么可以实现原子性
数据库·redis·lua
学地理的小胖砸8 小时前
【Python 操作 MySQL 数据库】
数据库·python·mysql
dddaidai1239 小时前
Redis解析
数据库·redis·缓存
数据库幼崽9 小时前
MySQL 8.0 OCP 1Z0-908 121-130题
数据库·mysql·ocp
Amctwd9 小时前
【SQL】如何在 SQL 中统计结构化字符串的特征频率
数据库·sql
betazhou10 小时前
基于Linux环境实现Oracle goldengate远程抽取MySQL同步数据到MySQL
linux·数据库·mysql·oracle·ogg
lyrhhhhhhhh10 小时前
Spring 框架 JDBC 模板技术详解
java·数据库·spring
喝醉的小喵11 小时前
【mysql】并发 Insert 的死锁问题 第二弹
数据库·后端·mysql·死锁
付出不多12 小时前
Linux——mysql主从复制与读写分离
数据库·mysql