通过pymysql可以使python能够轻松地操作数据库内容,而通过django的orm框架则可以更简单的操作数据库。
- Mysql + pymysql
import pymysql
# 1、连接mysql
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='root', charset='utf8', db='database_name')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 2、发送指令
cursor.execute("insert into admin(username,password,mobile) values('zhangsan', '123', '15500009999')")
conn.commit()
# 3、关闭
cursor.close()
conn.close()
- Django开发操作数据库

- 
    ` pymsql 有一个源码的错误,需要在init中添加代码,可以安装mysqlclient`避免- 
        如果用了pymsql,则需要在项目同名目录下的 __init__中添加:import pymysql pymysql.install_as_MySQLdb()
 
- 
        
- ORM可以帮我们做两件事:
    - 创建、修改、删除数据库中的表(不用写SQL语句)。【无法创建数据库】
- 操作表中得数据。(不用写SQL语句)
 
- settings中增加外界数据库
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'database_name',
        'USER': 'root',
        'PASSWORD': 'root',
        'HOST': '127.0.0.1',
        'POST': 3306,
    }
}
- 
    django操作表 - 在models.py中添加class
 from django.db import models # 新建表 class UserInfo(models.Model): name = models.CharField(max_length=32) paw = models.CharField(max_length=32) age = models.IntergerField(default=20) """ orm会自动转化执行语句: create table appname(相应app名称)_UserInfo( id bigint quto_increment primary key, name varchar(32), password varchar(32) age int ); """ # 新建数据 UserInfo.objects.create(name='zhangsan',paw='123',age=23) # 删除数据 UserInfo.objects.filter(id=3).delete() UserInfo.objects.all().delete() # 获取数据 # data_list = [x,x,x,...] data_list = UserInfo.objects.all() # .first()得到一个对象,取的是第一条数据 row_obj = UserInfo.objects.filter(id=2).first() for obj in data_list: print(obj.id, obj.name, obj.paw, obj.age) # 更新数据 UserInfo.objects.all().update(age=23) UserInfo.objects.filter(id=45).update(age=56)- 
        makemigrations migrate
- app需要提前注册到settings里面
 
建立一个MODEL
当然,为了方便讲解,我们还是建立一个简单的Model:
from django.db import models
class BookInfo(models.Model):
    title = models.CharField(max_length=20, verbose_name='名称')
    number = models.IntegerField(default=0, verbose_name='数量')
    comment = models.IntegerField(default=0, verbose_name='评论数量')
    is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')
    class Meta:
        db_table = 'books'
        verbose_name = '图书'   # 在管理员admin站点中显示的名称
    def __str__(self):
        return self.btitle
class StudentInfo(models.Model):
	"""
	看是男是女
	"""
    GENDER_CHOICES = (
        (0, 'female'),
        (1, 'male')
    )
    class Meta:
        db_table = 'students'
        verbose_name = '学生'
    name = models.CharField(max_length=20, verbose_name='名称')
    #  default 为缺省值 这点很重要哦!!!
    gender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='性别')
    info = models.CharField(max_length=200, null=True, verbose_name='信息')
    book = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='图书名称') # 外键,不能省略
    is_delete = models.BooleanField(default=False, verbose_name='删除')
    def __str__(self):
        return self.hname
数据库操作(正题)
给数据库中模型增加元素
使用save方法
book=BookInfo(title='高等数学',number='10000',comment='400')
book.save()
上面这个等价于:
book=BookInfo()
book.title = 'xxx'
book.number = 'xxx'
book.comment = 'xxx'
book.save()
使用create方法
StudentInfo.objects.create(name='豪哥哥'gender='1',info='小可爱',book=book)
防止重复创建
🌂:首先尝试获取,不存在就创建,可以防止重复
StudentInfo.objects.get_or_create(name='豪哥哥'gender='1',info='小可爱',book=book)
🌂:最后一种方法返回一个元组,(object, True/False),创建时返回 True, 已经存在时返回 False
数据库内容的修改
使用update方法
当然filter中的查找条件也可以改为其他的后面会讲解
StudentInfo.objects.filter(info='小可爱').update(info='大可爱')
使用get方法配合save方法
🌂:关于__exact后面也会讲解的
# 两种方式
stu = StudentInfo.objects.get(gender__exact = 1)   # 可以且仅可以返回一条数据。 没有数据或返回多条数据都会抛异常。
stu = StudentInfo.objects.get(gender= 1)   # 简写形式 __exact可以省略。返回模型对象
stu.name = "小帅哥"
stu.save()
数据库内容的查询
get函数(上面提了这里不多讲)
(知道get返回一条数据就ok!)
all函数 (查询所有)
students = StudentInfo.objects.all()   # 查询所有,返回QuerySet查询集(可以遍历)
迭代用法如下所示:
stu = StudentInfo.objects.all()
for i in stu:
    print(i.name)
🌂:多说一点,如果想要知道数据库中有多少条数据,可以使用count方法
StudentInfo.objects.count()
结果简单来说就是有多少行,很容易理解对吧
filter函数 (条件查询)
属性名称__比较运算符=你要修改的内容
注意了!!!敲重点!!!
属性名称和比较运算符间使用两个下划线,记住是两个
exact的使用
前面已经提到过,搬运工哈哈哈
# 两种方式
stu = StudentInfo.objects.get(gender__exact = 1)   # 可以且仅可以返回一条数据。 没有数据或返回多条数据都会抛异常。
stu = StudentInfo.objects.get(gender= 1)   # 简写形式 __exact可以省略。返回模型对象
contains、startswith、endswith(模糊查询)
从单词字面意思可知:
contains:查询包含”某个值”
statwith:以什么开头
endswith:以什么结尾
这里不给例子了
空值查询
🌂:查询学生名不为空的学生名
StudentInfo.objects.filter(title__isnull=False)
返回QuerySet对象:
<QuerySet [<BookInfo: 豪哥哥>, <BookInfo: 小哥哥>>
比较查询
gt :大于 (greater then)
gte:大于等于 (greater then equal)
lt :小于 (less then)
lte :小于等于 (less then equal)
随便整一个例子:
BooktInfo.objects.filter(number__gte=200)
exclude函数 (filter函数取反)
查询number不为300的所有图书。
books = BookInfo.objects.exclude(number = 300)
 # 与filter函数作用相反
 #返回QuerySet查询集(可以遍历)
order_by函数 (排序)
books = BookInfo.objects.all().order_by('-number')   # 'id'表示升序; '-number'表示降序。
books = BookInfo.objects.order_by('-number')   #  其实.all()可以省略。 默认查询所有。最好还是加上吧!
# 对查询结果进行排序
# 返回QuerySet
暂时到这里吧,觉得基础比较实用的部分!