django使用mysql数据库

Django开 发操作数据库比使用pymysql操作更简单,内部提供了ORM框架。

下面是pymysql 和orm操作数据库的示意图,pymysql就是mysql的驱动,代码直接操作pymysql ,需要自己写增删改查的语句

django 就是也可以使用pymysql、mysqlclient作为驱动,但是目前对mysqlclient的支持更好,在驱动的基础只上封装了orm框架,不用直接去写sql,是操作更简单了。

1、安装第三方模块

bash 复制代码
pip install mysqlclient

我的是windows环境,这样安装的时候报错,我们需要先下载需要先下载mysqlclient whl文件

下载地址:

https://www.lfd.uci.edu/\~gohlke/pythonlibs/#mysqlclient

或者https://pypi.org/project/mysqlclient/#files

找对对应的python版本下载,我的是3.7就下载这个

下载后,放到一个目录,cmd 进入到该目录,再执行

bash 复制代码
pip install mysqlclient-1.4.6-cp37-cp37m-win_amd64.whl

就可以安装成功了。

2、ORM

ORM可以帮助我们做两件事:

  • 创建、修改、删除数据库中的表(不用你写SQL语句)。[无法创建数据库],数据库我们使用其它工手动创建
  • 操作表中的数据(不用写SQL语句)

django连接数据库

在settings.py中配置mysql

python 复制代码
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'unicom',
        'USER': 'root',
        'PASSWORD': '123456',
        'HOST': '10.172.3.171',
        'PORT': 3306,
    }
}

创建表

在app01目录下的models.py 中写一个类,类名是UserInfo, 那么表面就会是app01_userinfo,django会自动加上app的名字

字段 通过models来创建,选择不同的字段类型,常用的字段类型有:

CharField 字符型

IntegerField 整形

DecimalField 浮点型

DateField 日期类型,只包含年月日

DateTimeField 日期类型,包含年月日时分秒

BigIntegerField 长整型

SmallIntegerField 小整型

python 复制代码
from django.db import models
class UserInfo(models.Model):
    name = models.CharField(max_length=32)
    password = models.CharField(max_length=64)
    age = models.IntegerField()

在app01下面的models.py中创建一个UserInfo的类,必须继承models.Model

django 会帮我们自己创建一个表名为app01_UserInfo的表,包含字段name, password,age

相当于执行下面语句

create table app01_userinfo(

id bigint auto_increment primary key,

name varchar(32),

password varchar(64),

age int

);

每个表都会自动给创建id列

执行命令创建数据库表: 注意app要先注册

python 复制代码
py -3 manage.py makemigrations
py -3 manage.py migrate

如果已经手动创建了admin表的,要用orm 来连接数据库可以,又不希望django改变表明,指定数据表名称,通过内部类 Meta指定表名

python 复制代码
from django.db import models

class admin(models.Model):
    name = models.CharField(max_length=32)
    password = models.CharField(max_length=64)
    age = models.IntegerField()

    # 添加一个时间字段
    create_time = models.DateTimeField(null=True)

    class Meta:
        db_table = 'admin'

在表中新增列时,由于已存在列中可能已有数据,所以新增列必须要指定新增列对应的数据:

  • 手动输入一个值。
  • 设置默认值
python 复制代码
age=mode1s.IntegerField(default=2)
  • 允许为空
python 复制代码
data=models.IntegerField(null=True, blank=True )

对表的操作

一般是在实现的函数中来操作数据库

在views.py中要导入 from app01 import models

查询类

python 复制代码
models.UserInfo.objects.all()     #查询数据库中所有内容,返回的是[obj,obj,obj],一行数据一个对象
models.UserInfo.objects.filter(id=nid).first()     #根据条件查询,只获取第一个对象

对字符串的查询

python 复制代码
models.PrettyNum.objects.filter(mobile='136')                                 #等于136
models.PrettyNum.objects.filter(mobile__startswith='136')                     #以136开头
models.PrettyNum.objects.filter(mobile__endswith='888')                       #以888结尾
models.PrettyNum.objects.filter(mobile__contains='136')                       #包含136

对于数字的查询

python 复制代码
models.PrettyNum.objects.filter(id=12)       #等于12
models.PrettyNum.objects.filter(id__gt=12)    #大于12
models.PrettyNum.objects.filter(id__gte=12)    #大于等于12
models.PrettyNum.objects.filter(id__lt=12)    #小于12
models.PrettyNum.objects.filter(id__lte=12)    #小于等于12

查询支持两种不同的写法

python 复制代码
models.PrettyNum.objects.filter(id=3,mobile='12312341234')

data_dict = {'mobile':'13413241234','id':3}
models.PrettyNum.objects.filter(**data_dict)
相关推荐
2301_764150563 分钟前
C#怎么判断进程是否在运行_C#如何管理系统进程【必备】
jvm·数据库·python
justjinji7 分钟前
Django DRF权限怎么加_IsAuthenticated与自定义BasePermission
jvm·数据库·python
橘子编程8 分钟前
PostgreSQL全栈指南:从入门到精通
数据库·postgresql
a9511416429 分钟前
解决 Bookmarklet 中 %0A 换行符导致的跨环境执行失败问题
jvm·数据库·python
解救女汉子10 分钟前
MySQL存储过程运行出错怎么排查_使用DECLARE HANDLER捕获错误
jvm·数据库·python
Absurd58714 分钟前
SQL嵌套查询在多租户系统应用_数据隔离逻辑
jvm·数据库·python
2301_7826591815 分钟前
怎样使用Navicat高级特权进行还原时解决字符集冲突_企业数据保护
jvm·数据库·python
椰猫子16 分钟前
数据库(约束、数据库设计(多表关系)、多表查询、事务)
数据库
m0_6403093018 分钟前
mysql如何处理连接数过多导致响应慢_mysql连接数调优
jvm·数据库·python
weixin_4585801220 分钟前
PHP怎么实现Toran Proxy代理_PHP依赖包缓存加速【技巧】
jvm·数据库·python