muzirigel 2019-12-20
在使用Django 框架开发web应用的过程中,不可避免的会涉及到数据的管理操作,如增删改查,使用的数据库管理软件有mysql.oracle,Microsoft SQL Server等.
编写sql语句的时候,直接编写原生sql语句会存在几个方面的问题,严重的影响了开发效率,
''' 1. sql语句执行效率低,程序员需要耗费精力去优化sql语句 2.数据库迁移:针对mysql开发的sql语句没法直接应用到oracle数据库上,只要需要迁移数据库,就要考虑平台问题 '''
所以为了解决这两个问题,Django引入了ORM概念(Object Relational Mapping)对象关系映射.
它在pymysql上进行一层封装,对于数据操作,不需要再去写原生sql语句,
我们可以==基于面向对象的思想去编写类,对象,调用相应的方法,ORM会将这个转换,映射成原生SQL然后交给pymysql执行==.
mysql> create database hello world
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 使用mysql数据库 'NAME': 'hello_world', # 要连接的数据库 'USER': 'root', # 链接数据库的用于名 'PASSWORD': '', # 链接数据库的用于名 'HOST': '127.0.0.1', # mysql服务监听的ip 'PORT': 3306, # mysql服务监听的端口 'CHARSET': 'utf8', 'ATOMIC_REQUEST': True, #设置为True代表同一个http请求所对应的所有sql都放在一个事务中执行 #(要么所有都成功,要么所有都失败),这是全局性的配置,如果要对某个 #http请求放水(然后自定义事务),可以用non_atomic_requests修饰器 'OPTIONS': { "init_command": "SET storage_engine=INNODB", #设置创建表的存储引擎为INNODB } } }
在__init__.py里面添加两行代码
import pymysql pymysql.install_as_MySQLdb() # 替换
4.如果你向查看orm语句内部真正的sql语句有两种方式
1.如果是queryset对象 可以直接点query查看
2.配置文件中 直接配置
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', }, }, 'loggers': { 'django.db.backends': { 'handlers': ['console'], 'propagate': True, 'level':'DEBUG', }, } }
在模型层里面创建表
from django.db import models class Book(models.Model): titile = models.CharField(max_length=32) price = models.DecimalField(max_digists=8,decimal_places=2) publish_date = models.DateField() # 在定义一个__str__打印对象的时候便于识别 def __str__(self): return self.name+'对象'
生成数据库迁移记录的文件,而且是放在migrations文件夹里的
python manage.py makemigrations
真正提交到数据库命令
python manage.py migrate
开始操作之前配置一下Django测试环境可以提高开发效率
from djang.test import TestCase import os if __name__ =="__main__": os.environ.setdefault("DJANGO_SETTINGS_MODULE","app01.settings") import django from app01 import models
? ORM查询
? """
? LOGGING = {
? ‘version‘: 1,
? ‘disable_existing_loggers‘: False,
? ‘handlers‘: {
? ‘console‘: {
? ‘level‘: ‘DEBUG‘,
? ‘class‘: ‘logging.StreamHandler‘,
? },
? },
? ‘loggers‘: {
? ‘django.db.backends‘: {
? ‘handlers‘: [‘console‘],
? ‘propagate‘: True,
? ‘level‘: ‘DEBUG‘,
? },
? }}
?
?
?
? django测试环境搭建
? import os
if __name__ == "__main__": os.environ.setdefault("DJANGO_SETTINGS_MODULE", "one_search.settings") import django django.setup() # 你就可以在下面测试django任何的py文件