前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【云+社区年度正文】Django从入门到精通No.3---与数据库交互

【云+社区年度正文】Django从入门到精通No.3---与数据库交互

原创
作者头像
Python进阶者
修改2020-11-30 10:19:21
9620
修改2020-11-30 10:19:21
举报

一、前言

之前我们学到了模型的概念,提到了关联关系以及一些字段,现在我们来对这些知识进行扩充并且应用,那么就需要与数据库进行交互才能实现了。

二、与数据库建立连接

前面我们讲过django的模型和关联关系后,我们来试着操纵下数据库,首先我们需要在django中配置数据库,进入settings.py文件中,如下:

这里我们可以设置四种数据库类型,如下:

代码语言:javascript
复制
'django.db.backends.postgresql'
'django.db.backends.mysql'
'django.db.backends.sqlite3'
'django.db.backends.oracle'

除此之外,databases还有其它的内部选项,如下:

代码语言:javascript
复制
ATOMIC_REQUESTS:为True时数据库事务包装每个视图,默认为False
AUTOCOMMIT:为False时禁用Django事务管理,默认为True
HOST:指定连接的主机名或ip地址,如果使用(‘/’)正斜杠开头则通过套接字连接
CONN_MAX_AGE:数据库连接的生命周期,默认为0请求结束时关闭数据库,设置为None无限持久连接
OPTIONS:链接到数据库时使用的额外参数,可用参数因数据库类型而异。
'OPTIONS':{'read_default_file':'add/my.conf',} #优先于NAME,USER,PASSWORD,HOST,PORT
#设置mysql启用严格模式
'OPTIONS':{'init_command':"SET sql_mode='STRICT_TRANS_TABLES'"}
PASSWORD:设置密码,不与SQLite一起使用
PORT:指定端口
TIME_ZONE:设置时区
DISABLE_SERVER_SIDE_CURSORS:True时禁用服务器端游标
USER:链接用户名
TEST:测试数据库

如果我们想配置一个MySQL数据库,如下:

代码语言:javascript
复制
    'db1':{
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db1',
        'USER': 'root',
        'PASSWORD': '123456',
        'HOST': '127.0.0.1',
        'PORT': '3306',
        'OPTIONS': {
            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'", 
        },   #mysql使用严格模式,不指定会有警告信息

配置好了之后,我们需要使用pymysql模块来使数据库连接上,只需在该目录的init.py文件中添加如下代码即可:

代码语言:javascript
复制
import pymysql
pymysql.install_as_MySQLdb()

下面分别是postgresql和oracle的配置方法,如下:

代码语言:javascript
复制
    'db2':{
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'db2',
        'USER': 'xxxxxx',
        'PASSWORD': 'xxxxx'
    }
​
​
        'db3':{
        'ENGINE': 'django.db.backends.oracle',
        'NAME': 'db3',
        'USER': 'xxxxxxx',
        'PASSWORD': 'xxxxxxx',
        'HOST': '',
        'PORT': '',
    }

三、生成迁移文件

所有的配置设置好了之后,我们就可以通过迁移命令生成一个文件,如下:

该文件包含了我们创建的关系表的结构,它将应用同步到指定的数据库中。

四、迁移信息同步到数据库

由于我们没指定,因此会保存到默认的sqlite3数据库中,如果想把它保存到MySQL数据库中,很简单,如下:

代码语言:javascript
复制
python manage.py migrate --database=db1

直接指定数据库即可。

五、导出数据

如果我们要导出数据库的内容也很简单,如下:

代码语言:javascript
复制
python manage.py dumpdata he >1.json #保存单个数据库的数据
python manage.py dumpdata auth >1.json#保存所有数据库的数据

六、导入数据

有导出势必有导入,如下:

代码语言:javascript
复制
python manage.py loaddata app1_fixture.json --database=db1

接下来我们将这些信息保存到数据库中,如图:

这样就把我们刚刚配置好的关联表的信息输入到了sqlite3数据库中去了,这个时候我们可以对模型中的类进行操作了。

七、操作数据库

我们可以在cmd窗口中来实现数据库的基本操作,如图:

如果你不习惯在cmd中操作,也可以把代码写在app的views.py文件中,如下:

然后把这个视图函数添加到urls.py文件中,如图:

可以看到,我们已经输出了结果,只是目前我们没有往数据库中插入任何数据,因此没有任何值。首先我们来看看我们编写的数据模型类,如下:

代码语言:javascript
复制
from django.db import models
from django.utils import timezone
# Create your models here.
class book(models.Model):
	id=models.AutoField(primary_key=True)
	book_name=models.CharField(max_length=30)
	book_price=models.IntegerField()
class title(models.Model):
	start=models.DateTimeField(default=timezone.now)
	end=models.DateTimeField(auto_now=True)
	bk=models.ForeignKey(book,on_delete=models.CASCADE)
class people(models.Model):
	article=models.CharField(max_length=20)
	age=models.IntegerField()
	p=models.ManyToManyField(book)
	t=models.OneToOneField(title,on_delete=models.CASCADE)

可以看到,我们这里设置了多种关联关系,比如一对多,多对多,一对一,这样可以更方便大家理解。

1.增加

如果我们要进行数据库的增加操作,我们需要先行创建一个类对象,也就是我们的模型,这里有四种方法可选,如下:

代码语言:javascript
复制
1.book.objects.create(book_name='fds',book_price=43)

2.b=book(book_name='fds',book_price=43)
  b.save()#保存

3.b=book(book_name='fds')
b.book_price=43
b.save()

4.book.objects.get_or_create(book_name='fds',book_price=43)防止重复

2.查询

有了对象后我们就需要获取这些对象的值了,如下:

代码语言:javascript
复制
1.book.objects.all()
2.book.objects.all()[:3] #获取3本书的信息,不支持负索引,可以节约内存
book.objects.all().reverse()[:2] #最后两本书
3.book.objects.get(book_name='西游记')#获取书名为西游记的信息
4.book.objects.filter(book_name='红楼梦')##过滤书名为西游记的信息
book.objects.filter(id__lt=6,id__gt=1)#获取id大于1且小于6的值
book.objects.filter(id__in=[1,2,3]) #获取id等于1,2,3的数据
book.objects.filter(id__range=[1,5]) #获取id为1~5之间的数据
book.objects.filter(book_name__icontains='aaa')#包含aaa,且aaa不区分大小写
book.objects.filter(book_name__iexact='aaa')#为aaa,但是不区分大小写
5.book.objects.exclude(book_name='水浒传')#去除书名为西游记的其它信息

3.删除

删除操作非常简便,只需要我们先选好对象,然后进行删除即可,如下:

代码语言:javascript
复制
book.objects.filter(book_name='水浒传').delete()

4.更新

和删除操作一样简便,如下:

代码语言:javascript
复制
book.objects.filter(book_name='红楼梦').update(book_price=100)

也可以通过get函数获取指定条件的对象然后修改单条数据,如下:

代码语言:javascript
复制
b=book.objects.get(book_name='红楼梦')
b.book_price=299
b.save()

这样做的好处是更加灵活。如图:

5.获取个数和对应的值

如果我们想获取某个满足条件的对象的个数或者值的话,很简单,如下:

代码语言:javascript
复制
book.objects.filter(book_name='红楼梦').count()#个数
 book.objects.filter(book_price=321).values('id') #id的值

6.排序分组

有时候我们需要给数据进行排序后再输出,这里使用一个函数即可搞定,如下:

代码语言:javascript
复制
book.objects.filter(book_name='红楼梦').order_by('id') #升序排序
book.objects.filter(book_name='红楼梦').order_by('-id') #降序排序

如果我们想把结果进行分组,也是一个函数就搞定,如下:

代码语言:javascript
复制
book.objects.filter(book_name='水浒传').values("id").annotate(book_price=Cou
nt('id'))

7.去重

如果多个查询数据合并到一起,则有可能会出现重复现象,因此需要去重,如下:

代码语言:javascript
复制
b1=book.objects.filter(id__lt=6,id__gt=1)#获取id大于1且小于6的值
b2=book.objects.filter(id__in=[1,2,3]) #获取id等于1,2,3的数据
b3=book.objects.filter(id__range=[1,5]) #获取id为1~5之间的数据
b4=b1 | b2 | b3
b4.distinct()

这样即可去重。如图:

八、总结

以上就是django操作数据库的最常用到的函数以及功能了,把这些学会了基本上你就能开发一个简易的小博客网站了。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、前言
    • 二、与数据库建立连接
      • 三、生成迁移文件
        • 四、迁移信息同步到数据库
          • 五、导出数据
            • 六、导入数据
              • 七、操作数据库
                • 1.增加
                • 3.删除
                • 4.更新
                • 5.获取个数和对应的值
              • 八、总结
              相关产品与服务
              云数据库 SQL Server
              腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档