Django操作数据库
- 1、ORM框架
- 2、ORM-创建数据库
- 3、ORM-连接数据库
- 4、ORM-操作表
- 4.1、类创建表
- 4.2、修改表结构
- 4.2.1、删除表结构
- 4.2.2、新增表结构
- 5、ORM-增删改查
- 5.1、新增数据
- 5.2、删除数据
- 5.3、查询数据
- 5.4、更新数据
1、ORM框架
- Django开发操作数据库很简单,内部提供了ORM框架
ORM可以帮助我们做两件事:
创建、修改、删除数据库中的表(不用写SQL语句),但是无法创建数据库
操作表中的数据(不用写SQL语句),Django会利用ORM将代码翻译成SQL语句来操作数据库
- 使用ORM之前还需安装第三方模块
pip install mysqlclient
2、ORM-创建数据库
由于ORM无法创建数据库,因此需要我们利用mysql来创建。
- 启动mysql并输入密码登录
mysql -u root -p
- 创建数据库
create database djangodb DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
- 查询数据库看是否创建成功
show databases;
3、ORM-连接数据库
- 在settings.py文件中进行配置和修改
- 删去db.sqlite3,并修改连接数据库的代码
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 引擎
'NAME': 'djangodb', # 数据库名字
'USER': 'root', # 用户名
'PASSWORD': 'root', # 密码
'HOST': '127.0.0.1', # 安装MySQL的机器,一般是本机
'PORT': 3306,
}
}
4、ORM-操作表
4.1、类创建表
- 在models.py中创建一个类,类中写入若干字段名
- 编写类之后,ORM会根据类自动执行下述SQL语句来生成表(下述的SQL语句不需要自己写)
create table app01_userinfo(
id bigint auto_increment primary key,
name varchar(50),
password varchar(60),
age int
)
- 表名:app名称_类名小写
- 类中的字段对应表中的列
- 自动生成id列,且是自增、主键
- 此时我们查询数据库可以看到并未创建该表
- 上述操作只是生成表,如果想让django在数据库中创建该表,还需要执行下述命令
python manage.py makemigrations
python manage.py migrate
执行命令之前需要注意以下几点:
- 确保app提前被注册
- 当前的目录为根目录,必须包含manage.py,这样它才会发挥作用
- 使用的python解释器必须安装了mysqlclient
- 查询数据库的表时可以看到已经创建成功
生成很多其他的表是因为Django在执行上述命令时会去找每个app的models中的类来生成表,而Django默认提供了很多其他的app,这些app也依赖于一些表,因此会生成内部默认的一些表,如果不需要注释掉即可。
4.2、修改表结构
4.2.1、删除表结构
当想要删除表或表中的列时,只需要将models.py中的对应代码删掉或注释掉,重新执行下述命令即可
python manage.py makemigrations
python manage.py migrate
4.2.2、新增表结构
在表中新增列时,由于已存在列中可能已有数据,所以新增列必须要指定新增列对应的数据
- 在表中新增size列
- 重新执行上述命令时会出现下述选择(这里选择第一种选择)
- 第二种选择是在代码中添加默认值
- 第三种选择是允许数据为空
5、ORM-增删改查
5.1、新增数据
类名.objects.create(字段名=值,...)
5.2、删除数据
- 根据筛选条件删除数据
类名.objects.filter(筛选条件).delete()
- 删除所有数据
类名.objects.all().delete()
5.3、查询数据
- 获取符合条件的所有数据
data_list = 类名.objects.all()
- 根据筛选条件获取数据
data_list = 类名.objects.filter(筛选条件)
- 获取第一条数据
obj = 类名.objects.filter(筛选条件).first()
all()和filter()获取的数据类型均为QuerySet类型,可以看作数据列表类型,即[对象,对象,对象],而first()获得的是对象类型
5.4、更新数据
- 更新所有数据
类名.objects.all().update(更新的字段名=新数据)
- 根据筛选条件更新数据
类名.objects.filter(筛选条件).update(更新的字段名=新数据)