5-ORM操作
配置数据库
# 在 settings.py 文件中有一个配置项就是配置数据库的,一般为 DATABASES
# 但是Django默认的数据库是sqlite3数据库
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
# 模板文件,都建议大写,NAME这里不要写成DB或者DATABASE,会报错
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
# 数据库名字
'NAME': "",
# 数据库用户名
"USER": "",
# 数据库密码
"PASSWORD": "",
# 数据库 IP,本地默认是127.0.0.1/localhost
"HOST": "localhost",
# 数据库端口
"PORT": 3306,
# 数据库编码
"CHARSET": "utf8mb4",
}
}
from django.db.backends import mysql # 然后顶部导入mysql 直接复制对应字段即可 django.db.backends
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 这里修改为mysql
'NAME': 'db_django',
'HOST': '127.0.0.1',
'USER': 'root',
'PASSWORD': '123',
'CHARSET': 'utf8mb4',
'PORT': 3306
}
}
如果遇到报错
解决方案1,使用猴子补丁
# 在项目下的 __init__ 或者任意的应用名下的 __init__ 文件中书写一下代码
import pymysql
pymysql.install_as_MySQLdb()
解决方案2,下载
mysqlclient
模块
# 直接下载
pip install mysqlclient
# 如果下载失败,建议换源下载,比如豆瓣
pip install mysqlclient -i https://pypi.douban.com/simple
# 如果还是失败,搜索 mysalclient whell ,然后通过pip install 安装
ORM
ORM可以帮帮助我们做两件事:
- 创建、删除、修改数据库中的表。(不用写SQL语句),【无法创建数据库】
- 操作表中的数据。(不用写SQL语句)
类名 --> 表名
对象 --> 记录
属性 --> 字段
常见
Django
模型字段在MySQL
中的对应关系表
Django 模型字段 |
对应MySQL 字段 |
说明 |
---|---|---|
AutoField |
INT AUTO_INCREMENT PRIMARY KEY |
主键 |
CharField |
VARCHAR |
字符串字段,指定最大长度 |
TextField |
TEXT |
大段文本 |
IntegerField |
INT |
整数 |
FloatField |
FLOAT 或 DOUBLE |
浮点数 |
DateTimeField |
DATETIME |
用于存储日期和时间 |
BooleanField |
BOOL 或 TINYINT(1) |
用于存储布尔值(True 或 False) |
ForeignKey |
INT |
外键 |
Django操作表
创建表, 需要在modles.py中去操作
from django.db import models
class UserInfo(models.Model):
"""
max_length:长度 必须写,不写会报错
ERRORS:
app1.UserInfo.data: (fields.E120) CharFields must define a 'max_length' attribute.
verbose_name:相当于commit,注释
default:默认值
null: 是否允许为空 null=True blank=True 就表示这一列字段可以为空
"""
username = models.CharField(max_length=32, verbose_name="用户名")
password = models.CharField(max_length=32, verbose_name="密码")
age = models.IntegerField(verbose_name="年龄", null=False)
gender = models.CharField(max_length=32, default="女")
"""
底层类似于写了这样的SQL语句
create table appname_userinfo(
id bigint auto_increment primary key;
username varchar(32);
password varchar(32) unique;
age int;
gender varchar(32) default="女"
);
"""
# 依次执行下面两条方法
python manage.py makemigrations
python manage.py migrate
# 也可以通过Tools下面的Run manage.py Task...去执行
makemigrations
migrate
# 只要修改了models中有关数据库相关的代码,就必须执行上面的数据库迁移命令
# 执行这两条命令的前提是,APP必须已经注册到数据库里面了
# 数据库迁移命令 将操作记录到(migrations文件夹)中
在表中新增列时,由于已存在列中可能已有数据,所以新列必须要指定新增列对应的数据:
- 新增一个值
Please select a fix:
1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
2) Quit, and let me add a default in models.py
# 如果输入1 会让你输入一个值,那么原有数据包括新增的这一列的字段都会改成这个值
# 如果输入2 会退出,然后建议您使用default设置一个新的值,那么原有的值的这个新增字段都会变成这个默认值
-
设定默认值
gender = models.CharField(max_length=32, default="女")
-
允许为空
data = models.CharField(max_length=32, null=True, blank=True)
如果要删除表或者删除某一个刚刚新建的没有数据的字段,直接注释掉,然后重新提交刚刚的两个语句就可以了
表中的数据
新增数据
xx.objects.create(xxx)
# 如果有默认值,可以不用写有默认值的字段
models.UserInfo.objects.create(username='兰陵王', password='123')
删除数据
# 方式1
# xx.objects.filter(筛选条件).delete()
models.UserInfo.objects.filter(username='兰陵王').delete()
# 删除表里面的全部数据(危险操作)
# xx.objects.all().delete()
models.UserInfo.objects.all().delete()
获取数据
# xx.objects.all()
# 相当于 select * from table;
# 得到的是一个QuerySet的数据类型,可以理解为一个列表,列表是一行一行的数据[行,行,行]
models.UserInfo.objects.all()
data_list = models.UserInfo.objects.all()
print(data_list)
# <QuerySet [<UserInfo: UserInfo object (5)>,
# <UserInfo: UserInfo object (6)>,
# <UserInfo: UserInfo object (7)>,
# <UserInfo: UserInfo object (8)>]>
通过对象.字段名去获取数据
data_list = models.UserInfo.objects.all()
for data in data_list:
print(data.username, data.password, data.age)
# 大乔 123 3
# 阿珂 123 4
# 庄周 123 5
# 海月 123 6
可以筛选后,通过.first获取一行数据
data_obj = models.UserInfo.objects.filter(id="5").first()
print(data_obj.username, data_obj.password, data_obj.age)
# 大乔 123 3
更新数据
# 更新全部数据
models.UserInfo.objects.all().update(password="666")
# 更新一条数据
# xx.objects.filter(条件).update(字段=字段值)
models.UserInfo.objects.filter(username='海月').update(username="海月月")
过滤数据
# xx.objects.exclude(条件)
# 筛选年龄小于4岁
obj = models.UserInfo.objects.filter(age__lt=4)
for item in obj:
print(item.username, item.password, item.age)
# 大乔 666 3
# 筛选年龄大于4岁
obj = models.UserInfo.objects.filter(age__gt=4)
for item in obj:
print(item.username, item.password, item.age)
# 庄周 666 5
# 海月月 666 6
# 筛选密码包含6的结果
obj = models.UserInfo.objects.filter(password__contains='66')
for item in obj:
print(item.username, item.password, item.age)
# 大乔 666 3
# 阿珂 666 4
# 庄周 666 5
# 海月月 666 6
本文作者:小满三岁啦
本文链接:https://www.cnblogs.com/ccsvip/p/18090666
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步