配置神通数据库

1) 找到项目的配置文件settings.py,设置数据库后台为oscar,配置好oscar的ip(192.168.114.134),端口号(2003), 数据库名(osrdb),用户名,密码。如下:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.oscar',
        'NAME': '192.168.114.134:2003/osrdb',
        'USER': 'sysdba',
        'PASSWORD': 'szoscar55',
    }
}

数据类型

Django和oscar方言支持的数据类型和数据库数据类型以及python类型的对应关系如下表:

oscar方言类型 数据库数据类型 Python类型  
BooleanField NUMERIC bool  
IntegerField NUMERIC Int  
CharField VARCHAR(n) string  
DecimalField NUMERIC float  
DateField DATE datetime.date  
DateTimeField TIMESTAMP datetime.datetime  
TextField CLOB string  
BinaryField BLOB Bytes  
TimeField TIMESTAMP time  
FloatField FLOAT8 float  
FileField VARCHAR(n) string  
ImageField VARCHAR(n) string  

模型创建

示例:

# models.py
from django.db import models
# Create your models here.
class Person(models.Model):
    tauto_id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=20,blank = True,null = True)
    timage = models.ImageField(blank = True,null = True,upload_to='img')
    tfile = models.FileField(blank = True,null = True,upload_to='img')
    tinteger = models.IntegerField(blank = True,null = True)
    tbig_integer = models.BigIntegerField(blank = True,null = True)
    tsmall_integer = models.SmallIntegerField(blank = True,null = True)
    tdate = models.DateField(auto_now=True,)
    tdatetime = models.DateTimeField(auto_now=True,)
    tbool = models.BooleanField(blank = True,null = True)
    tfloat = models.FloatField(blank = True,null = True)
    tblob = models.BinaryField(blank=True,null=True)
    tclob = models.TextField(blank=True,null=True)
    job = models.ForeignKey('Work',null=True,on_delete=models.SET_NULL)

    def __str__(self):
        return str(self.name)

class Work(models.Model):
    id = models.AutoField(primary_key=True)
    work = models.CharField(max_length=30)

    def __str__(self):
        return self.work

数据迁移

数据表创建

1、在创建好的app文件夹里的models.py中,如章节5“模型创建”一节中,定义好model类;

2、打开终端命令窗口中,cd到项目根目录下,执行命令:python manage.py makemigrations,会生成app文件夹里生成migrations文件夹,并在migrations文件夹里生成移植的py文件;

3、在当前终端命令窗口中继续执行命令:python manage.py migrate,命令完成后,会在数据库中创建与models.py中的模型对应的表。

数据表删除

1、在Models.py文件中删除数据表对应的model类;

2、在项目更目录下运行Terminal,执行python manage.py makemigrations命令;

3、Terminal中继续执行python manage.py migrate命令

数据操作

原生SQL语句

from django.db import connection
with connection.cursor() as cursor:
    cursor.execute('SELECT * FROM myapp_person')
row = cursor.fetchone()

增加数据

通过create方法创建实例

def test_create_instance(name):
    validated_data = {
        "name" : name,
        "timage" : "./风车.png",
        "tfile" : "./风车.png",
        "tinteger" : random.randint(1,999),
        "tbig_integer" : 816841666,
        "tsmall_integer" : random.randint(1,99),
        "tdate" : date.today(),
        "tdatetime" : datetime.now(),
        "tbool" : True,
        "tfloat" : round(random.uniform(401, 699), 3),
        "tblob" : b'test blob',
        "tclob" : 'test clob',
        "job" : Work.objects.get(work='工人'),
    }
    instance = Person.objects.create(**validated_data)
    print(instance.name+" 实例创建成功...")
    return instance

通过save方法创建实例

def test_save_instance():
    instance = Person(
        name = "测试名字07",
        timage = "./风车.png",
        tfile = "./风车.png",
        tinteger = 21,
        tbing_integer = 816841666,
        tsmall_integer = 2,
        tdate = date.today(),
        tdatetime = datetime.now(),
        tbool = True,
        tfloat = 646.4861,
        tblob = b'test blob',
        tclob = 'test clob',
        job = Work.objects.get(work='工人'),
    )
    instance.save()
    print(instance.name+" 实例创建成功...")
    return instance

查询数据

查询所有数据

def test_query_all():
    """
    测试查询表中所有数据
    :return: 返回实例,QuerySet类型
    """
    print('测试查询表中所有数据')
    ps = Person.objects.all().order_by("-tauto_id")
    return ps

用get方法查询

提示:get方法查询出的实例为0时会报错,另外当实例结果超过一个时,也会报错;

def test_query_get():
    """
    测试用get方法查询
    :return: 返回实例类型
    """
    print('测试查询表中所有数据')
    p = Person.objects.get(name="测试名字07",job = Work.objects.get(work='工人'),)
    return p

用filter方法查询

filter等值查询

def test_query_filter():
  """
  测试用filter方法查询
  :return: 返回QuerySet类型
  """
  ps = Person.objects.filter(name="测试名字07",job = Work.objects.get(work='工人'),)
  return ps

Filter不等查询

用filter配合 >、>=、<、<=、in进行组合查询

Person.objects.filter(tauto_id__gt=2)  # >
Person.objects.filter(tauto_id__gte=2)  # >=
Person.objects.filter(tauto_id__lt=2)  # <
Person.objects.filter(tauto_id__lte=2)  # <=
Person.objects.filter(tauto_id__in=[1,3,5]) # in

Filter去重查询

distinct去重,针对单个字段去重或针对多个字段去重 示例: 针对单个字段去重

Person.objects.all().values('name').distinct()

示例: 针对多个字段去重

Person.objects.all().values('name','tinteger').distinct()

Filter非空查询

Isnull 查询

Person.objects.filter(name__isnull=False)

Filter Like模糊查询

Person.objects.filter(name__startswith='测试')
Person.objects.filter(name__istartswith='test').all()
Person.objects.filter(name__endswith='tt').all()
Person.objects.filter(name__iendswith='TT').all()
Person.objects.filter(name__contains='test')
Person.objects.filter(name__icontains='test')

Filter 非包含查询

Person.objects.exclude(tauto_id__in=[1,3,5])

Get正向关联查询

Person类中,定义了外键字段job。由person去查找到person对应的job,这种查询方向属于正向。

示例:

def test_query_get_relation_1():
    """
    测试用get方法进行正向关联查询
    :return: 返回外键关联的实例类型
    """
    print('测试正向查询 person 的 job')
    job = Person.objects.get(name="测试名字07").job
    return job

filter正向关联查询

Person类中,定义了外键字段job。由person去查找到person对应的job,这种查询方向属于正向。

提示:Person.objects.filter(job__work="工人") 中 “__”是双下划线,job是Person类中的job字段,work是Work类中work字段。

示例:

def test_query_filter_relation_1():
    """
    测试用filter方法进行正向关联查询
    :return: 返回实例的QuerySet
    """
    print('测试正向查询 person 的 job')
    ps = Person.objects.filter(job__work="工人")
    return ps

Get反向关联查询

提示: Work.objects.get(work="工人").person_set.all(),Person类中,定义外键job字段中没有related_name参数,反关联时,用关联的类名小写+_set。

示例:

def test_query_get_relation_2():
    """
    测试用get方法进行反向关联查询
    :return: 返回实例的QuerySet
    """
    print('测试get反向查询 person 的 job')
    ps = Work.objects.get(work="工人").person_set.all()
    return ps

Filter反向关联查询

提示:Work.objects.filter(person__name="测试名字07"),person__name:Person类名小写+双下划线+字段

示例:

def test_query_filter_relation_2():
    """
    测试用filter方法进行反向关联查询
    :return: 返回实例的QuerySet
    """
    print('测试反向查询 person 的 job')
    work = Work.objects.filter(person__name="测试名字07")
    return work

数据的更新和删除

数据的更新和删除见 “大对象操作”一节中的更新和删除

聚合查询

用aggregate做聚合查询

示例:

def test_aggregate():
    test_create_instance("测试名字03")
    test_create_instance("测试名字04")
    from django.db.models import Max, Min, Sum, Avg, Count
    _dic = Person.objects.all().aggregate(Avg('tinteger'), Max('tinteger'), Min('tinteger'),Sum("tinteger"),Count("tinteger"))
    print(_dic)
    _dic = Person.objects.all().aggregate(Avg('tsmall_integer'), Max('tsmall_integer'), Min('tsmall_integer'),Sum("tsmall_integer"),Count("tsmall_integer"))
    print(_dic)
    _dic = Person.objects.all().aggregate(Avg('tbig_integer'), Max('tbig_integer'), Min('tbig_integer'),Sum("tbig_integer"),Count("tbig_integer"))
    print(_dic)
    _dic = Person.objects.all().aggregate(Avg('tfloat'), Max('tfloat'), Min('tfloat'),Sum("tfloat"),Count("tfloat"))
    print(_dic)
    tinteger = Work.objects.aggregate(Max('person__tinteger')) #反查
    print(tinteger)

分组查询

用annotate进行分组查询,功能同group by

示例:

def test_annotate():
    from django.db.models import Count,Max
    pSet = Person.objects.annotate(Max('tfloat'))
    for p in pSet:
        print(p.__dict__)
    wSet = Work.objects.annotate(Count('person__tinteger'))
    for w in wSet:
        print(w.__dict__)

分页

用内置的分页器进行分页

示例:

def test_Paginator():
    from django.core.paginator import Paginator
    ps = Person.objects.all()
    paginator = Paginator(ps,2)
    _ps = paginator.page(number=1).object_list
    print(_ps)

排序

‘-tauto_id’按照单个字段逆序排序;多个字段排序;

示例:

def test_order_by():
    ps = Person.objects.order_by('-tauto_id')
    print(ps)
    ps = Person.objects.order_by('tinteger','tsmall_integer')
    print(ps)

大对象操作

Clob

通过django 的orm操作clob 示例:

# myapp/models.py
from django.db import models

class Person(models.Model):
  testblob = models.BinaryField(blank=True,null=True,)
  testclob = models.TextField('个人简介',blank=True,null=True,help_text='个人简介,选填')

  def __str__(self):
      return self.testclob

增加带有clob字段的数据

# Test.py
from myapp.models import Person

obj = Person(
    testclob = 'jack',
    )
obj.save()

修改clob字段
# Test.py
from myapp.models import Person

p = Person.objects.get(id=1)
p.testclob="new jack"
p.save()

查询clob字段
# Test.py
from myapp.models import Person

p = Person.objects.get(id=1)
print(p.testclob)

删除
# Test.py
from myapp.models import Person

p = Person.objects.get(id=1)
p.delete()

Blob

通过django 的orm操作blob 示例:

# myapp/models.py
from django.db import models

class Person(models.Model):
  testblob = models.BinaryField(blank=True,null=True,)
  testclob = models.TextField('个人简介',blank=True,null=True,help_text='个人简介,选填')

  def __str__(self):
      return self.testclob

增加带有blob字段的数据

# Test.py
from myapp.models import Person

obj = Person(
    testblob = b'jack',  # 注意此处是字节码
    )
obj.save()

修改blob字段

# Test.py
from myapp.models import Person

p = Person.objects.get(id=1)
p.testclob = b"new jack"  # 注意此处是字节码
p.save()

查询clob字段

# Test.py
from myapp.models import Person

ps = Person.objects.get(id=1)
print(ps.testblob)

Blob删除与clob示例代码的删除一致,故不作单独示例