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

相关推荐
云和数据.ChenGuang4 小时前
Django 应用安装脚本 – 如何将应用添加到 INSTALLED_APPS 设置中 原创
数据库·django·sqlite
woshilys5 小时前
sql server 查询对象的修改时间
运维·数据库·sqlserver
Hacker_LaoYi5 小时前
SQL注入的那些面试题总结
数据库·sql
建投数据6 小时前
建投数据与腾讯云数据库TDSQL完成产品兼容性互认证
数据库·腾讯云
Hacker_LaoYi7 小时前
【渗透技术总结】SQL手工注入总结
数据库·sql
岁月变迁呀7 小时前
Redis梳理
数据库·redis·缓存
独行soc7 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍06-基于子查询的SQL注入(Subquery-Based SQL Injection)
数据库·sql·安全·web安全·漏洞挖掘·hw
你的微笑,乱了夏天7 小时前
linux centos 7 安装 mongodb7
数据库·mongodb
工业甲酰苯胺7 小时前
分布式系统架构:服务容错
数据库·架构
独行soc8 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍08-基于时间延迟的SQL注入(Time-Based SQL Injection)
数据库·sql·安全·渗透测试·漏洞挖掘