Django——orm概述及在django中使用

一、orm概述

1 orm:对象关系映射(跟语言无关)
        数据库中的表     ----》对应程序的一个类
        数据库中的一行数据----》对应程序中的一个对象
2 python中常见orm框架
    -django的orm框架
    -sqlachemy orm框架
    
3 java:(扩展),java中写web项目
    ssh框架 :spring+struts(有漏洞)+hibernate(orm框架) (10年前用的多,现在已经弃用,有些国企还在用)
    ssm框架:spring+springmvc+mybatis(orm框架,可以写原生sql)
    springboot:sb框架 ,已经整合了,把tomcat内置进去了
    springcloud:微服务
4 orm能干的事
    -创建表(不能创建数据库,手动创建数据库)
    -增加删除表内字段
    -增删查改数据

 如果操作mysql,ORM是在pymysq之上又进行了一层封装

二、django中orm的使用

0 sqlite:也是要给数据库,文件数据库,一个库就是要给文件,不需要单独安装
    -咱们现在在用,也要用到关系型数据库,不想装mysql,就可以使用sqlite
    -移动开发本地存储数据,存在sqlite中

1 创建个UserInfo表,在models中写一个类
2 表中有字段(类属性),字段有属性,


# 第一步在models中写要给类
    class UserInfo(models.Model):
        # 字段属性--》后面那个对象决定的,
        # 该字段自增,并且是主键
        id = models.AutoField(primary_key=True)
        # 该字段是varchar类型,长度为32(唯一约束,是否是索引,默认值是,是否可以为空)
        name = models.CharField(max_length=32)
        # 密码字段
        #password =models.CharField(max_length=64)  #代表已删除
     
# 增加
#第二步,把表创建出来(执行两个命令就创建出来了)
-python3 manage.py makemigrations # 这条命令会在migrations创建一条记录,数据库变更记录 -python3 manage.py migrate # 把更改同步到数据库
3 增加删除字段
  
  删除字段 首先注释掉要删除的字段,再在terminal中执行第二步里的两个命令就可以了
  增加字段
比如要增加
      #数字类型 默认 1男 2女
      gender=models.IntegerField()
      #省份
      province=models.CharField(max_length=32)
    写好后在terminal中执行那两个命令
会出现可能之前的表里有数据,那么就需要在
      password =models.CharField(max_length=64,null=True)
      gender=models.IntegerField(default=0)
      province=models.CharField(max_length=32,null=True)

  如不想走到那一步,新增字段直接设置(default=默认值 或者 null=True)

  -两条数据库迁移命令(一个是记录,一个是真正的迁移)
  python manage.py makemigrations
  python manage.py migrate

  -插入

  方式一:
  user=UserInfo(name=lqz,age=19)
  user.save()
  方式二:
  user=UserInfo.objects.create(name=lqz,age=19)
-查询所有
UserInfo.objects.all() # 放到列表中[user1,user2,user3]

 参考比较:

三、若想将模型转为mysql数据库中的表,需要在settings中配置:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'lili',
        'USER': 'root',
        'PASSWORD': '123456',
        'HOST': '127.0.0.1',
        'PORT': 3306,
        'ATOMIC_REQUEST': True,
        'OPTIONS': {
            "init_command": "SET storage_engine=MyISAM",
        }
    }
}
'''
'NAME':要连接的数据库,连接前需要创建好
'USER':连接数据库的用户名
'PASSWORD':连接数据库的密码
'HOST':连接主机,默认本机
'PORT':端口 默认3306
'ATOMIC_REQUEST': True,
设置为True统一个http请求对应的所有sql都放在一个事务中执行(要么所有都成功,要么所有都失败)。
是全局性的配置, 如果要对某个http请求放水(然后自定义事务),可以用non_atomic_requests修饰器 
'OPTIONS': {
             "init_command": "SET storage_engine=MyISAM",
            }
设置创建表的存储引擎为MyISAM,INNODB
'''
 

注意:

NAME即数据库的名字,在mysql连接前该数据库必须已经创建,而上面的sqlite数据库下的db.sqlite3则是项目自动创建 USER和PASSWORD分别是数据库的用户名和密码。
设置完后,再启动我们的Django项目前,我们需要激活我们的mysql。然后,启动项目,会报错:no module named MySQLdb 。
这是因为django默认你导入的驱动是MySQLdb,可是MySQLdb 对于py3有很大问题,所以我们需要的驱动是PyMySQL 所以,我们只需要找到项目名文件下的__init__,在里面写入:
import pymysql pymysql.install_as_MySQLdb()
最后通过两条数据库迁移命令即可在指定的数据库中创建表 : python manage.py makemigrations python manage.py migrate

如果报错如下:

"django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.3 or newer is required; you have 0.7.11.None"


是因为: MySQLclient目前只支持到python3.4,因此如果使用的更高版本的python,需要修改如下:

通过查找路径C:ProgramsPythonPython36-32Libsite-packagesDjango-2.0-py3.6.eggdjangodbackendsmysql
这个路径里的文件把

if version < (1, 3, 3):
     raise ImproperlyConfigured("mysqlclient 1.3.3 or newer is required; you have %s" % Database.__version__)

注释掉就可以了
原文地址:https://www.cnblogs.com/guojieying/p/13744746.html