Django-数据库操作
在settings.py文件中:
import pymysql # 一定要添加这两行!通过pip install pymysql!
pymysql.install_as_MySQLdb()
# 修改DATABASES的值
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mysite',
'HOST': '192.168.1.1',
'USER': 'root',
'PASSWORD': 'pwd',
'PORT': '3306',
}
}
创建数据 数据类型
from django.db import models
class UserInfo(models.Model):
uid = models.AutoField(primary_key=True)
# 自增长ID,必须带参数为primary_key=True,并且是唯一主键
user = models.CharField(max_length=10)
# 字符串类型,最大长度为10
age = models.IntegerField(default=1)
# 数字类型,默认为1
sex = models.BooleanField()
# BOOL类型
email = models.EmailField()
# 自带检查 Email 合法性的 CharField
Intor = models.TextField()
# 长文本类型
Blog = models.URLField()
# 自带检查 URL 合法性的 CharField
# -------------------文件上传-----------------
upload = models.FileField(upload_to='uploads/')
# 文件上传到 MEDIA_ROOT/uploads
# 这个字段不能设置primary_key和unique选项.在数据库中存储类型是varchar,默认最大长度为100.
upload_s = models.FileField(upload_to='uploads/%Y/%m/%d/')
# 文件上传到 MEDIA_ROOT/uploads/2019/07/04
upload_e = models.FilePathField(path="/home/images", match="foo.*", recursive=True)
# 这个字段的值被限制在系统上某个目录中的所有文件名集合中。有三个参数
# path = '': 该参数必需。上行所说的‘某个目录’的绝对路径。Example: "/home/images".
# match = 'pattern': 可选参数。格式是正则表达式。用来拣选符合匹配正则表达式的文件
# recursive = True / False: 可选参数,默认为False。设定是否递归该目录下所有子目录的所有文件
add_date = models.DateTimeField(auto_now_add=True)
# 设置初次创建的时间
update_date = models.DateTimeField(auto_now=True)
# 设置最后修改的时间
创建数据库一共需要三步:
修改models.py中模型
运行python3 manage.py makemigrations为改动创建迁移记录
运行python3 manage.py migrate,将操作同步到数据库。
数据增删改查
数据的添加方法:一步到位的方法
data.objects.create(User='zz')
单个赋值的方法
datas = data()
datas.User = '陈二狗'
datas.save()
查
常规的有5种方法获取数据,返回都是数据集
第一种是 data.objects.all()
这种方法获取的是这张表里面的所有数据
第二种是 data.objects.get(id=1)
这个比较坑,不常用,找不到直接异常
这种方法必须确保获取的结果只有一个(多个对象会直接异常),没有匹配条件的时候会报异常,获取的条件是id=1
第三种方法是 data.objects.filter(id=2)
这种方法是筛选出id=2的数据,括号内还能有多个条件,比如(id=2,gender=’boy’)
第四种方法是 data.objects.exclude(id=2)
这种方法是获取到id不等于2的数据
第五种方法是 data.objects.order_by(name)
这种方法获取到的结果是按照name进行排序后的结果
获取单个对象
第一种方法是 data.objects.first(name=’zeo’)
data.objects.last(name=’zeo’)
这种方法获取到的结果是符合条件的第一个对象,当然还有最后一个对象,使用的是.last(name=’小桃红’)
注释:这些方法都可迭代使用
按照日期获取当天数据
from django.utils import timezone
from datetime import timedelta
now = timezone.now()
start = now - timedelta(hours=23,minutes=59,seconds=59)
CurrentDaySubdomain = URL.objects.filter(change_time__gt=start)
for c in CurrentDaySubdomain:
print(c.url)
其他按照时间获取数据方法
1、gt:大于某个时间
now = datetime.datetime.now()
start = now – datetime.timedelta(hours=23, minutes=59, seconds=59)
a=yourobject.objects .filter(youdatetimcolumn__gt=start)#前一天
2、gte:大于等于某个时间:
a=yourobject.objects .filter(youdatetimcolumn__gte=start)
3、lt:小于
a=yourobject.objects .filter(youdatetimcolumn__lt=start)
4、lte:小于等于
a=yourobject.objects .filter(youdatetimcolumn__lte=start)
5、range:查询时间段
start_date = datetime.date(2005, 1, 1)
end_date = datetime.date(2005, 3, 31)
Entry.objects.filter(pub_date__range=(start_date, end_date))
6、year:查询某年
Entry.objects.filter(pub_date__year=2005)
7、month:查询某月
Entry.objects.filter(pub_date__month=12)
8、day:某天
Entry.objects.filter(pub_date__day=3)
9、week_day:星期几
Entry.objects.filter(pub_date__week_day=2)
10、获取今天的日期,日期格式为yyyy-MM-dd
from django.utils.timezone import now, timedelta
date = now().date() + timedelta(days=-1) #昨天
date = now().date() + timedelta(days=0) #今天
date = now().date() + timedelta(days=1) #明天
以上方法获取的数据的结果是QuerySet()类型的数据,是一个结果类,想要获取最后的实际结果,需要使用索引获取
datas = data.objects.filter(id=2).values()[0]
这样的结果是一个字典,索引0即是获取values()列表的第一个结果
当然你也可以使用赋予变量的形式进行获取
datas = data.objects.get(id=1)
u_id = datas.id
u_User = datas.User
这种方式进行获取数据,这个前提是在只有一个数据的情况下进行
如果是all()或者其他方法获取较多的数据集时候,也可以这样获取每个结果
data_0 = data.objects.all()
# 这里的结果是一个数据集合,可以循环迭代和使用索引获取值
data_1 = data_0[0]
u_id = data_1.id
u_User = data_1.User
# 通过这样的方式,就可以实现进行单独数据的获取
像这种的集合,如果想要把里面的数据全都打印出来,可以这么处理
ret = ''
data_0 = data.objects.all()
for data_1 in data_0:
ret += data_1.id + '|' + data_1.User + '<br>'
批量操作,查询加修改
all_subdomains.filter(subdomain_ip=all_subdomain_one.subdomain_ip).update(nmapscan=result_domain_ports_numbners)
all_subdomains.filter(subdomain_ip=all_subdomain_one.subdomain_ip).update(nmapscan_ports=result_domain_ports)