配置神通数据库¶
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 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示例代码的删除一致,故不作单独示例