一、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__) 注释掉就可以了