一、基础说明
Django版本:3.2.7
Oracle:11g
Django学习教程:https://code.ziqiangxuetang.com/django1.x/django-intro.html
3.0变更内容:Django 3.0 release notes | Django documentation | Django
Model字段说明:django 框架模型之models常用的Field,这些Field的参数、及常见错误原因及处理方案。__世纪末的魔术师_的博客-CSDN博客
推荐博客博主: 大江狗 Django基础
二、创建App包
S1:pycharm的Terminal中输入:python manage.py startapp cust_app
S2:全局文件settings.py中的INSTALLED_APPS内加入:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'cust_app',
]
三、创建服务接口
参考文档:https://zhuanlan.zhihu.com/p/356405945
S1:安装类库:pip install djangorestframework
S2:settings.py文件,将Django REST framework添加到INSTALLED_APPS配置中:
INSTALLED_APPS = [
'rest_framework',
...]
S3:settings.py文件,将app的名称添加到INSTALLED_APPS配置
INSTALLED_APPS = [
'cust_app.apps.CustAppConfig',
'rest_framework',
]
S4:定义路由
在cust_app文件夹下新建urls.py文件
from django.conf.urls import url
from cust_app import views
urlpatterns = [
url(r'^api/addcust$', views.add_customer),
url(r'^api/delcust$', views.delete_customer),
url(r'^api/updatecust$', views.update_customer),
url(r'^api/querycust',views.query_customer),
url(r'api/queryall',views.query_all_customer),
]
把app的路由添加到项目的urls.py中
from django.urls import include
urlpatterns = [
url(r'^', include('tutorials.urls')),]
S5:新建Api服务接口
from django.http import JsonResponse
from rest_framework import status
from rest_framework.decorators import api_view
from cust_app.models import customer
@api_view(['POST'])
def add_cust(request):
cust_obj = customer(cust_name="张三", cust_type="游客")
cust_obj.save()
return JsonResponse({"message": "客户创建成功"}, status=status.HTTP_200_OK)
在Terminal下输入:
python manage.py runserver
Postman例子:
四、Django配置数据库
4.1 Oracle数据库:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.oracle',
'NAME': '10.128.202.5/orcl',
'USER': 'autotest', # 登录的用户名
'PASSWORD': 'autotest', # 登录的密码
}
}
4.2 MySql数据库:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 数据库引擎
'NAME': 'LRMySql', # 数据库名
'USER': 'root', # 账号
'PASSWORD': 'LR@b123456', # 密码
'HOST': 'localhost', # HOST
'POST': 3306, # 端口
}
}
五、Django连接Oracle数据库
5.1 Django 3.X连接Oracle11g报错“ORA-00904 IDENTITY_COLUMN”
或“ORA-02000: missing ALWAYS keyword”
主要原因:
Django新版本连Oracle11g版本冲突问题。当前只有Django 1.X版本支持Oracle11g,Django 2.X及以上支持Oracle12g。
目前Django1.X可以正常使用,但是官方不再维护和提供技术支持。
解决方案1:
参考文档:https://blog.csdn.net/weixin_44293372/article/details/106952052
S1:卸载当前高版本Django:pip uninstall django
S2:安装1.X版本:pip install Django==1.11.22
S3:urls.py内容变更,将“path”换为“url”:
from django.conf.urls import url
from django.contrib import admin
# from django.urls import path
urlpatterns = [
url('admin/', admin.site.urls),
]
S3:数据库表和model之间映射,步骤参考6.1
S4:卸载当前Django1.x版本:pip uninstall django
S5:安装当前最新版本:pip install Django
解决方案2:
将Oracle升级到12.2。
(Django 3.0 正式支持 Oracle 12.2 和 18c。对 Oracle 12.1 的上游支持将于2021年7月结束。所以不确定随着Django的新版发布,Oracle的支持版本会不会相应变更?)
六、Django连接Mysql数据库
6.1 方案一:pymysql
参考文档:https://blog.csdn.net/weixin_43499626/article/details/84351572
S1:配置数据库(MySql)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 数据库引擎
'NAME': 'LRMySql', # 数据库名
'USER': 'root', # 账号
'PASSWORD': 'LR@b123456', # 密码
'HOST': 'localhost', # HOST
'POST': 3306, # 端口
}
}
S2:安装类库:pip3 install pymysql
S3:在全局的setting.py的同级目录的__init__.py 加入如下配置
import pymysql
pymysql.install_as_MySQLdb()
S4:在Mysql的cmd命令行内创建数据库:create database LRMysql;
S5:在app=》models.py内创建数据类,完成7.1内容
S6:mysql的cmd命令行查看表名:
mysql> use LRMysql
Database changed
mysql> show tables;
+-------------------+
| Tables_in_lrmysql |
+-------------------+
| django_migrations |
| lr_customer |
+-------------------+
2 rows in set (0.00 sec)
6.2 方案二(推荐):mysqlclient
S1:配置数据库(MySql),参考方案一
S2:安装mysql插件mysqlclient pip install mysqlclient
S3:在app=》models.py内创建数据类,完成7.1内容
S4:查看数据库已存在该数据表
七、ORM映射
7.1 model=》(映射)数据库表
S1:models.py内写入数据模型class
class customer(models.Model):
cust_id = models.CharField('用户编号', primary_key=True, max_length=40)
cust_name = models.CharField('用户名称', max_length=30)
cust_type = models.CharField('用户类型', max_length=10)
# 指定表名。默认数据库表名(mysql_app_customer)
class Meta:
db_table = "lr_customer"
S2:将models.py下的模型转换为数据表,要用命令来执行,在Terminal下输入
# 记录本次变更
python manage.py makemigrations cust_app
# 同步到数据库
python manage.py migrate cust_app
或(指定数据库):
# 如果django配置多个数据库
# 在migrations文件夹下生成记录
python manage.py makemigrations cust_app
# 默认可以不写参数
python manage.py migrate --database default
# 指定数据库进行数据映射
python manage.py migrate cust_app --database db2
S3:查看数据库,表映射成功
7.2 数据库表=》(映射)model
参考文档:django-连接Oracle数据库_害怕的萌新的博客-CSDN博客_django oracle
S1:数据库内表已经创建成功
S2:在Terminal下输入:
导入单个表
# 导入lr_account表模型至modules.py
python manage.py inspectdb lr_account > app名/models.py --database default
导入全部表
# 导入所有表模型至AAA.py
python manage.py inspectdb > app名/AAA.py
- ORM之增删改查(单个数据库)
参考博客:Django之ORM增删改查 - birdfish - 博客园
8.1 查询全部数据
@api_view(['POST'])
def query_all_customer(request):
cust_obj = customer.objects.all()
cust_data = {}
for item in cust_obj:
cust_data[item.cust_name] = item.cust_type
return JsonResponse({"data": cust_data},
status=status.HTTP_200_OK)
8.2 按条件查询
@api_view(['POST'])
def query_customer(request):
cust_data = JSONParser().parse(request)
cust_name = cust_data.get("name")
cust_obj = customer.objects.filter(cust_name=cust_name)
cust_data = {}
for item in cust_obj:
cust_data["name"] = item.cust_name
cust_data["type"] = item.cust_type
return JsonResponse({"data": cust_data},status=status.HTTP_200_OK)
8.3 修改单条数据
@api_view(['POST'])
def update_customer(request):
cust_data = JSONParser().parse(request)
cust_name = cust_data.get("name")
cust_type = cust_data.get("type")
#查询数据
cust_obj = customer.objects.filter(cust_name=cust_name)
# 变更数据内容
cust_obj.update(cust_type=cust_type)
return JsonResponse({"message": "客户{}更改客户类型成功".format(cust_name)},
status=status.HTTP_200_OK)
8.4 新增单条数据
@api_view(['POST'])
def add_customer(request):
cust_data = JSONParser().parse(request)
cust_obj = customer()
cust_obj.cust_name = cust_data.get("name")
cust_obj.cust_type = cust_data.get("type")
cust_obj.save()
return JsonResponse({"message": "客户创建成功"}, status=status.HTTP_200_OK)
8.5 删除单条数据
@api_view(['POST'])
def delete_customer(request):
cust_data = JSONParser().parse(request)
cust_name = cust_data.get("name")
cust_obj = customer.objects.filter(cust_name=cust_name)
cust_obj.delete()
return JsonResponse({"message": "客户{}删除成功".format(cust_name)},
status=status.HTTP_200_OK)
- Django同时关联多个数据库
参考文档:Django之连接多个数据库的相关配置 - huangyanpeng - 博客园
Django如何连接多个数据库实现读写分离_大江狗-CSDN博客
以MySql为例
S1:配置多个数据库
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 数据库引擎
'NAME': 'LRMySql', # 数据库名
'USER': 'root', # 账号
'PASSWORD': 'LR@b123456', # 密码
'HOST': 'localhost', # HOST
'POST': 3306, # 端口
},
'db2': {
'ENGINE': 'django.db.backends.mysql', # 数据库引擎
'NAME': 'mysql', # 数据库名
'USER': 'root', # 账号
'PASSWORD': 'LR@b123456', # 密码
'HOST': 'localhost', # HOST
'POST': 3306, # 端口
}
}
S2:model.py向数据库映射,需要指定数据库标识
python manage.py makemigrations cust_app --database db2
python manage.py migrate cust_app --database db2 # 指定数据库进行数据映射
S3:对数据库操作(增删改查)时,需要指定数据库标识
from django.http import JsonResponse
from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.parsers import JSONParser
from mysqlclient_app.models import customer
# Create your views here.
@api_view(["POST"])
def query_all(request):
"""
查询全部信息
:param request:
:return:
"""
dic_data = {}
# using("db2"):选择此查询集应针对哪个数据库执行
cust_obj = customer.objects.using("db2")
cust_data = cust_obj.all()
for item in cust_data:
dic_data[item.cust_id] = item.cust_name + "_" + item.cust_type
return JsonResponse({"data": dic_data}, status=status.HTTP_200_OK)
@api_view(["POST"])
def add_flower(request):
"""
添加信息
:param request:
:return:
"""
json_param = JSONParser().parse(request)
# using("db2"):选择此查询集应针对哪个数据库执行
cust_obj = customer.objects.using("db2")
cust_obj.create(cust_name=json_param.get("name"),
cust_type=json_param.get("type"),
cust_id=json_param.get("id")
)
return JsonResponse({"massage": "添加成功"}, status=status.HTTP_200_OK)
- Django模型修改、新增及数据迁移
参考文档:Django模型修改及数据迁移 - 再见紫罗兰 - 博客园
10.1现有模型修改、新增新模型
S1:新增(修改)models.py内容
如果是在现有的model内插入新列,则需要设置新列的默认值
class customer(models.Model):
cust_id = models.CharField('用户编号', primary_key=True, max_length=40)
cust_name = models.CharField('用户名称', max_length=30)
cust_live = models.CharField('是否喜欢', max_length=10, default="")
# 新增cust_desc列,设置默认值为"",否则已存在的数据会报错
cust_desc = models.CharField('用户描述', max_length=100, default="")
S2:在Terminal下输入
python manage.py makemigrations mysqlclient_app
python manage.py migrate mysqlclient_app --database db2
S3:view内涉及的内容进行同步变更
10.2 数据迁移
django 项目提供了数据导出、导入的方法,不指定 appname 时默认为导出所有的app
S1:导出用户数据,在Terminal下输入
python manage.py dumpdata mysqlclient_app > myapp.json --database db2
S2:导入用户数据,在Terminal下输入
python manage.py loaddata myapp.json --database db2