python自动化运维学习第二十天--ORM增删改查

数据库的配置

django支持的数据库类型有sqlite、MySQL、oracle、postgresql。
Django默认使用的是sqlite数据库,自带了sqlite数据库驱动,引擎名为django.db.backends.sqlite3。在settings.py中可以查看

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

使用MySQL时需要修改这个配置

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
       'NAME': 'books',       #数据库名称
        'USER': 'root',       #数据库用户名
        'PASSWORD': '',       #数据库密码
        'HOST': '',           #数据库主机,留空默认为localhost
        'PORT': '3306',       #数据库端口
    }
}

启动项目,会报错:no module named MySQLdb
这是因为django默认导入的驱动是MySQLdb,可是MySQLdb对于py3有很大问题,所以我们需要的驱动是PyMySQL,只需要找到项目名文件下的__init__,在里面写入:

import pymysql
pymysql.install_as_MySQLdb()

ORM

前面讲过ORM是对数据库操作的封装,对ORM操作即可实现对数据库的增删改查等操作。
先在modules.py中创建几个表

from django.db import models

class UserInfo(models.Model):
    #num = models.IntegerField(default=0)      #创建数字类型的字段名,默认是0
    name = models.CharField(max_length=32, verbose_name="姓名")      #创建一个字符类型的字段,最大长度为32
    username = models.CharField(max_length=32,null=True)
    password = models.CharField(max_length=32,null=True)
    def __str__(self):
        return self.username
        #return self.num+self.name+self.username

class Number(models.Model):
    num = models.OneToOneField(to="UserInfo", verbose_name="学号")     #该表与UserInfo表一对一关系
    def __str__(self):
        return self.num

class School(models.Model):
    name = models.CharField(max_length=128, null=True, blank=True, verbose_name="名字")
    mac = models.URLField(max_length=128, null=True, blank=True, verbose_name="地址")      #URLField也是字符类型,只是python封装了判断URL的算法
    email = models.EmailField(max_length=128, null=True, blank=True, verbose_name="邮箱")     #EmailField也是字符类型,只是python封装了判断email的算法
    #true_false = models.BooleanField(max_length=128, null=True, blank=True, verbose_name="是否")     #布尔类型的
    #date = models.DateField(verbose_name="日期")       #日期类型
    #cla = models.ForeignKey(to="Classes")      #该表对classes表的关系是一对多
    def __str__(self):
        return self.name

class Classes(models.Model):
    sch = models.ForeignKey(to="School", default=1)
    name = models.CharField(max_length=128, null=True, blank=True, verbose_name="班级名")
    user = models.ManyToManyField(to="UserInfo")          #该表与UserInfo表是多对多关系
    def __str__(self):
        return self.name

在多对多关系中,Django会额外创建一个classes和userinfo对应关系的表classes_user表

查询

以上已经创建了几个表,再往每个表中添加一些数据,下面开始从数据库中查询数据
在urls.py文件中配置路由到views的test方法
url(r'^test/', views.test),
views.py文件

def test(request):
    school_li = models.School.objects.all()    #获取到School表中所有数据,放到school_li变量中
    for item in school_li:
        print(item.name, item.email)
    school = models.School.objects.get(id=1)    #使用get时,如果检索值不存在,则会报错
    print(school.name)
    obj = models.School.objects.filter(name='new_east')     #使用filter时,如果检索的值不存在,则返回空(没有值),推荐使用filter方法
    for item in obj:
        print(item)

    dic = {'name':'new_east'}
        obj1 = models.School.objects.filter(**dic).first()
    print(obj1)
    obj2 = models.School.objects.get(**dic)
    print(obj2)
    return HttpResponse("查询数据")

代码中列举了几种查询的方法,根据需要来选择。

增加

在views.py的test方法中对数据库表增加数据。

def test(request):
    dic1= {'name': '蓝翔'}
    obj3 = models.School.objects.create(**dic1)
    print(obj3)
    obj4 = models.School.objects.create(name='黄埔', mac='http://www.huangpu.com', email='[email protected]')
    print(obj4)
    return HttpResponse("插入数据")

启动后,访问test页面就会在school表中插入数据。

删除

从数据库表中删除数据,其实也比较简单,还是写在view里的test方法中

    obj5 = models.School.objects.filter(id=3).delete()
    #obj5 = models.School.objects.filter(**dic).delete()
    print(obj5)

执行后,obj5是一个元组,会有两个元素,第一个是删除的条数,第二个元素是一个字典,字典里的是删除表名和对应的条数
(1, {'demo.School': 1}) obj5的输出结果

修改

修改也比较简单,看代码

    obj6 = models.School.objects.filter(name='黄埔').update(name='北大', mac='https://www.pku.edu.cn', email='[email protected]')
    print(obj6)

执行后返回的是一个int类型,表示修改的行数
修改还有另一种方法

    obj7 = models.School.objects.get(name='黄埔')
    obj7.name='北大'
    obj7.save()

这种方法不推荐使用,因为在get时如果查找的值不存在会报错,而且没有第一种方法简洁

猜你喜欢

转载自blog.csdn.net/wang035759984/article/details/85223051