PyMySQL的基本操作(增删改查)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/geek64581/article/details/102648585

PyMySQL的基本操作(增删改查)

准备测试数据和演示工具

第一步:添加测试数据

insert into tb_books(id, btitle,bread, author) values
(1, ‘三国演义’,100, ‘罗贯中’),
(2, ‘西游记’,100, ‘吴承恩’),
(3, ‘水浒传’,100, ‘施耐庵’),
(4, ‘射雕英雄传’,12, ‘金庸’),
(5, ‘天龙八部’,36, ‘金庸’),
(6, ‘笑傲江湖’,100, ‘金庸’),
(7,‘雪山飞狐’,35, ‘金庸’);

第二步:shell工具

  • Django的manage工具提供了shell命令,帮助我们配置好当前工程的运行环境(如连接好数据库等),以便可以直接在终端中执行测试python语句。

通过如下命令进入shell

python manage.py shell

在这里插入图片描述
导入两个模型类,以便后续使用

  • 模型类如果未指明表名,Django默认以 小写app应用名_小写模型类名 为数据库表名。

from books.models import BookInfo

第一章 增加

增加数据有两种方法:

1.1 save

通过创建模型类对象,执行对象的save()方法保存到数据库中。

>>> from books.models import BookInfo
>>> book = BookInfo(btitle='三国演义', author='罗贯中', bread=100)
>>> book
<BookInfo: 三国演义>
>>> book.save()

1.2 create

通过模型类.objects.create()保存。

>>> BookInfo.objects.create(btitle='水浒传', author='施耐庵', bread=100)
<BookInfo: 水浒传>

第二章 删除

删除有两种方法:

2.1 模型类对象delete

>>> book = BookInfo.objects.get(btitle='射雕英雄传')
>>> book
<BookInfo: 射雕英雄传>
>>> book.delete()

2.2 模型类.objects.filter().delete()

BookInfo.objects.filter(btitle='水浒传').delete()

第三章 修改

修改更新有两种方法:

3.1 save

修改模型类对象的属性,然后执行save()方法

>>> book = BookInfo.objects.get(id=1)
>>> book
<BookInfo: 射雕英雄传>
>>> book.btitle = '射雕'
>>> book.save()

3.2 update

使用模型类.objects.filter().update(),会返回受影响的行数

>>> BookInfo.objects.filter(btitle='射雕').update(btitle='射雕英雄传')
1

第四章 查询

4.1 all 查询所有结果
4.2 filter 查询多个结果,加上过滤条件
4.3 get 查询一个结果,如果结果大于1个或者小于1个都会报错
4.4 exclude 查询多个结果,采用排除的语法
4.5 排序
查询语法格式:

模型类.objects.查询方法(条件)

4.1 all 查询所有


>>> BookInfo.objects.all()
<QuerySet [<BookInfo: 射雕英雄传>, <BookInfo: 天龙八部>, <BookInfo: 笑傲江湖>,
 <BookInfo: 雪山飞狐>, <BookInfo: 三国演义>, <BookInfo: 水浒传>]>

4.2 filter 条件过滤查询

SQL语句后面where语句:

1.相等 =
2.模糊查询 like
3.空查询 is null和is not null
4.范围查询 in
5.运算符 > =等
6.逻辑并列 and
7.逻辑或者 or

过滤条件的表达语法如下:

模型类.objects.filter(过滤条件)

过滤条件的语法如下:
属性名称__比较运算符=# 属性名称和比较运算符间使用两个下划线,所以属性名不能包括多个下划线

得到的是一个查询结果集,类似列表

1)相等

例:查询编号为1的图书。

BookInfo.objects.filter(id=1)
# BookInfo.objects.filter(id__exact=1) 的缩写

2)模糊查询

contains:是否包含。

说明:如果要包含%无需转义,直接写即可。

例:查询书名包含’传’的图书。

BookInfo.objects.filter(btitle__contains='传')

startswith、endswith:以指定值开头或结尾。

例:查询书名以’部’结尾的图书

BookInfo.objects.filter(btitle__endswith='部')

以上运算符都区分大小写,在这些运算符前加上i表示不区分大小写,如iexact、icontains、istartswith、iendswith.

3) 空查询

isnull:是否为null。

例:查询书名不为空的图书。

BookInfo.objects.filter(btitle__isnull=False)

4) 范围查询

in:是否包含在范围内。

例:查询编号为1或3或5的图书

BookInfo.objects.filter(id__in=[1, 3, 5])

5)比较查询

  • gt 大于 (greater then)
  • gte 大于等于 (greater then equal)
  • lt 小于 (less then)
  • lte 小于等于 (less then equal)

例:查询编号大于3的图书

BookInfo.objects.filter(id__gt=3)

6 ) 并且

如果查询的条件是两个或者多个条件的并列 比如需要查询BookInfo里btitle包含"传",并且id大于3的图书

BookInfo.objects.filter(btitle__contains='传', id__gt=3)

7 ) 或者

两个条件是或者需要使用到Q对象, 并用 | 连接两个条件 Q(属性名__运算符=值) | Q(属性名__运算符=值) 比如需要查询BookInfo里btitle包含"传",或者id大于3

from django.db.models import Q
BookInfo.objects.filter(Q(btitle__contains='传') |  Q(id__gt=3))

4.3 get

使用语法同filter一样,只是限制查询出来的结果必须有且仅有一个,否则都会报错。 得到的结果是一个模型类的对象-注意和filter的结果对比

>>> BookInfo.objects.get(id=1)
<BookInfo: 射雕英雄传>
>>> BookInfo.objects.get(id__gt=1) # 多个结果,报错
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/Users/wei/envs/demo/lib/python3.6/site-packages/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/Users/wei/envs/demo/lib/python3.6/site-packages/django/db/models/query.py", line 384, in get
    (self.model._meta.object_name, num)
books.models.MultipleObjectsReturned: get() returned more than one BookInfo -- it returned 5!
>>> BookInfo.objects.get(id__gt=1000) # 结果不存在,报错
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/Users/wei/envs/demo/lib/python3.6/site-packages/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/Users/wei/envs/demo/lib/python3.6/site-packages/django/db/models/query.py", line 380, in get
    self.model._meta.object_name
books.models.DoesNotExist: BookInfo matching query does not exist.

4.4 exclude

排除符合条件的其他所有 例:查询编号不等于3的图书

BookInfo.objects.exclude(id=3)

4.5 排序

BookInfo.objects.all().order_by('id')  # 升序
BookInfo.objects.all().order_by('-id')  # 降序

综合案例

  1. 需求:现在需要通过GET访问/books/all-books, 返回所有的图书title

  2. 步骤:

  1. 定义视图函数,查询数据库里所有的图书,并返回title
  2. 添加路由
  1. 实现:
# views.py
def all_books(request):
    books = BookInfo.objects.all() # 查询数据库

    titles = [book.title for book in books]
    return HttpResponse(str(titles)) # 返回
# 路由 url.py
    url(r'all-books', views.all_books)

猜你喜欢

转载自blog.csdn.net/geek64581/article/details/102648585