Python ORM数据库操作

EN
EN
2023-04-05 / 0 评论 / 47 阅读 / 正在检测是否收录...

创建数据库

表情 使用工具或者命令 自己创建一个数据库

项目连接数据库

首先确保已经安装了支持MySQL的Python驱动。
可以使用pip命令来安装:

pip install mysqlclient
pip install pymysql

打开项目的settings.py文件,并添加如下配置信息到DATABASES字典中:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '<database_name>',   # MySQL数据库名称
        'USER': '<username>',         # MySQL登录用户名
        'PASSWORD': '<password>',     # MySQL登录密码
        'HOST': '<host>',             # MySQL服务器地址(默认为localhost)
        'PORT': '<port>',             # MySQL服务器端口号(默认为3306)
    }
}

lt2jxum0.png

创建表

表情 去app下的models.py中创建指定的类 + 命令,自动创建表

from django.db import models
# Create your models here.
class UserInfo(models.Model):
    # id = models.AutoField(primary_key=True) #会自动创建
    name = models.CharField(max_length=30, verbose_name='姓名')  #varchar
    password = models.CharField(max_length=30, verbose_name='密码')   #varchar
    age = models.IntegerField(verbose_name='年龄') # int
    email = models.EmailField(verbose_name='邮箱',max_length=45)   #varchar

表情 命令

''' 必须先在settings.py中注册app,否则无法创建 '''
''' 读取所有已注册的App中的models.py文件,根据类生成配置文件并放到app下的migrations目录 '''
python manage.py makemigrations

''' 根据配置文件自动生成相应的SQL语句 '''
python manage.py migrate

修改、新增 表

修改 models.py 后 重新执行命令

class UserInfo(models.Model):
    # id = models.AutoField(primary_key=True) #会自动创建
    name = models.CharField(max_length=30, verbose_name='姓名')
    #将 password字段 改成 pwd 
    pwd = models.CharField(max_length=30, verbose_name='密码')
    age = models.IntegerField(verbose_name='年龄') # int
    email = models.EmailField(verbose_name='邮箱',max_length=45)

    # 添加一列
    qq = models.CharField(max_length=11, verbose_name='QQ',null=True,blank=True) # 添加一列 null=True,blank=True 表示可以为空,否则会报错
    wx = models.CharField(max_length=20, verbose_name='微信',default="") # 添加一列default="" 设置默认值

# 新增一个表
class Departmert(models.Model):
    title = models.CharField(max_length=32, verbose_name='标题')

数据操作 增删改查

表情 新增

# 第一种方式
models.UserInfo.objects.create(name="张三", password="12344556", age=18, email="123@qq.com")
# 第二种方式
models.UserInfo.objects.create(**{"name":"李四", "password":"123456", "age":18, "email":"456@qq.com"})

表情 查询

#查询所有 【返回 列表】
res = models.UserInfo.objects.all()
# 查询 张三且18岁  【返回 列表】
res = models.UserInfo.objects.filter(name="张三",age=18)
# 查询 张三且18岁 【返回 一行对象】 取一条数据
res = models.UserInfo.objects.filter(name="张三",age=18).frist()

''' 未查询数据时返回 None  '''


#查询 排序
res = models.UserInfo.objects.all().order_by("id") # asc
res = models.UserInfo.objects.all().order_by("-id") # desc

表情 修改

''' 
修改
在查询条件后面加上 update() 
'''
# 把所有年龄改成 19
models.UserInfo.objects.all().update(age=19)
# 把id=20的用户年龄改成 19
models.UserInfo.objects.filter(id=10).update(age=20)

表情 删除

''' 
删除
在查询条件后面加上 delete() 
'''
# 删除所有用户
models.UserInfo.objects.all().delete()
# 删除张三18岁的用户
models.UserInfo.objects.filter(name="张三",age=18).delete()

使用

web/ views.py 中写入数据库操作代码, 并在 urls.py 中配置好路由,访问不同的路由实现对应的功能

from web import views

urlpatterns = [
    path('admin/', admin.site.urls),

    path('login/', views.login),
    path('index/', views.index),
    path('adduser/', views.addUser),
    path('updateuser/', views.updateUser),
    path('deleteuser/', views.deleteUser),
]
from django.shortcuts import  render,redirect
from django.shortcuts import HttpResponse
from web import models # 导入models
import random

# 新增用户
def addUser(request):

    username = "sss %s" % str(random.random());
    models.UserInfo.objects.create(name = f"张{username}", password="123456", age=18, email="123@qq.com")

    return HttpResponse("添加成功")

# 修改用户
def updateUser(request):

    models.UserInfo.objects.filter(id=1).update(age=15)

    return HttpResponse("修改成功")

# 删除用户
def deleteUser(request):

    models.UserInfo.objects.filter(age=18).delete()

    return HttpResponse("删除成功")

创建带外键的表

from django.db import models

class Dept(models.Model):
    title = models.CharField(verbose_name='名称',max_length=32)

class User(models.Model):
    name = models.CharField(verbose_name='姓名',max_length=12)
    age = models.IntegerField(verbose_name='年龄')
    salary = models.FloatField(verbose_name='工资')


    # dept_id = models.IntegerField(verbose_name='部门ID') # 只是创建了一个字段,没有关联
    # 关联外键
    '''
    dept 创建的时候会创建 dept_id
        to_field="id" 可以不写,默认是id
        on_delete=models.CASCADE 级联删除
        on_delete=models.SET_NULL 设置为空,但是必须允许字段为空 null=True,blank=True
        on_delete=models.SET_DEFAULT 设置为默认值 加上 default=1
    '''
    # dept = models.ForeignKey(verbose_name='关联部门',to='Dept',to_field="id",on_delete=models.CASCADE)
    # dept = models.ForeignKey(verbose_name='关联部门',to='Dept',on_delete=models.SET_NULL,null=True,blank=True)
    dept = models.ForeignKey(verbose_name='关联部门', to='Dept', on_delete=models.SET_DEFAULT, default=1)

'''
有外键表的数据操作
'''

''' 新增 '''
# 创建数据时,使用 dept_id = 部门id
models.User.objects.create(name = '张三',age = 22,salary = 3000, dept_id = 1)

# 创建数据时,也可以使用 dept = 部门对象
deptObj = models.Dept.objects.filter(id=1).first()
models.User.objects.create(name = '张三',age = 22,salary = 3000, dept = deptObj)

''' 查询 '''
# 使用部门ID
models.User.objects.filter(dept_id = 1)
# 通过部门名称搜索用户 dept__name 双下划线。
models.User.objects.filter(dept__name = '开发部')

# 获取用户的部门名称
UserObj = models.User.objects.filter(id=1).first()
UserObj.dept.name
报错

因为mysql5.7及以下是免费的数据库,8.0之后是收费的。使用免费的数据库更放心,使用上没有什么区别。这个提示只是Django的版本检测提示,把它注释掉就好了。
项目\venv\Lib\site-packages\django\db\backends\base\base.py 中 找到 check_database_version_supported() 函数 ,注释掉。

lt2kdf2x.png

0

评论 (0)

取消