启动:python manage.py runserver 0.0.0.0:8000 :启动
pip install pymysql
在/jobapp/init.py连接数据库
import pymysql
pymysql.install_as_MySQLdb()
在setting中设置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
sqlite:轻量级数据库
修改为:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'jobapp_django', # 要连接的数据库,连接前需要创建好
'USER': 'root', # 连接数据库的用户名
'PASSWORD': '123456', # 连接数据库的密码
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
在models.py中创建类
from django.db import models
# Create your models here.
class userinfo(models.Model):
# 自动创建一个id列,id为主键、自增长
telephone = models.CharField(max_length=30,unique=True)
password = models.CharField(max_length=64)
email = models.EmailField()
自增长: id=models.AutoField(primary_key=True)
修改配置文件setting.py,告诉应用从哪里应用模块创建
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'user' #注意这里加上的是模块名称
]
执行创建命令: python manage.py makemigrations
生成临时文件"0001_initial.py"
该模块下必须有migrations文件夹,且有__init__.py
执行生成数据表的命令: python manage.py migrate
ps:执行3、4命令时出现错误:
django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.3 or newer is required; you have 0.7.11
解决方法:找到最后一行报错的py文件,将下面代码注释掉即可
py文件为:Python36-32\Lib\site-packages\django\db\backends\mysql\base.py
if version < (1, 3, 3):
raise ImproperlyConfigured(“mysqlclient 1.3.3 or newer is required; you have %s” % Database.version)
Django2.2报错 AttributeError: ‘str’ object has no attribute ‘decode’
解决方法: 出现这个错误之后可以根据错误提示找到文件位置,打开 operations.py 文件。根据错误信息提示,说明 if 语句执行时出错, query 是 str 类型,而 decode() 是用来将 bytes 转换成 string 类型用的,(关于Python编码点这里),由于 query 不需要解码,所以直接将 if 语句注释掉即可
if query is not None:
query = query.decode(errors=‘replace’)
增加数据
models.UserInfo.objects.create(**user) 或 models.UserInfo(**user).save()
在/user/views.py文件中:
from . import models
def add(request):
user={
"telephone":"13512345678",
"password":"123456",
"email":"[email protected]"
}
uu = models.UserInfo.objects.create(**user) # 将 user 插入到UserInfo表中,且uu返回数据库中刚加入的那个对象
# 或者
obj=models.UserInfo(**user)
obj.save()
print(obj.id) # 直接获取刚插入的数据的主键id
return HttpResponse('user....add.....')
obj.save()中的 force_insert 和 force_update:
force_insert:都插入 ; force_update:有则更新,没有则不操作
查询数据
查询所有数据
users=models.UserInfo.objects.all() # user不是字典列表,返回的是对象列表
for u in users:
print('u为:',u,' , u.id为:',u.id,' , u.telephone为:',u.telephone)
# u为: UserInfo object(1), u.id为: 1, u.telephone为: 13512345678
# u为: UserInfo object(2), u.id为: 2, u.telephone为: 13512345678
没有则为 []
获取部分列
users=models.UserInfo.objects.all().values('id','telephone')
print(users)
#
user_list=models.UserInfo.objects.all().values_list('id','telephone')
print(user_list)
#
条件查询
单条件
# select * from userinfo where telephone=110
res=UserInfo.objects.filter(telephone=110).values()
多条件and
# select id,telephone from userinfo where telephone=110 and id=10
res = UserInfo.objects.filter(telephone=110,id=10).values('id', 'telephone')
查找第一个
res=models.userinfo.objects.filter(telephone='13513211123').first()
没有数据则为 None
查找个数
res=models.userinfo.objects.filter(telephone='13512341234').count()
没有则为0
删除数据
res=models.userinfo.objects.all().delete()
res=models.userinfo.objects.filter(id=4).delete()
更新数据
res=models.userinfo.objects.all().update(password='000000')
res=models.userinfo.objects.filter(id=4).update(password='qweasd')
model字段类型
*'AutoField': 'integer AUTO_INCREMENT',
'BigAutoField': 'bigint AUTO_INCREMENT',
'BinaryField': 'longblob',
*'BooleanField': 'bool',
*'CharField': 'varchar(%(max_length)s)',
'CommaSeparatedIntegerField': 'varchar(%(max_length)s)',
*'DateField': 'date',
*'DateTimeField': 'datetime',
*'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)',
'DurationField': 'bigint',
'FileField': 'varchar(%(max_length)s)',
'FilePathField': 'varchar(%(max_length)s)',
*'FloatField': 'double precision',
*'IntegerField': 'integer',
'BigIntegerField': 'bigint',
'IPAddressField': 'char(15)',
'GenericIPAddressField': 'char(39)',
'NullBooleanField': 'bool',
*'OneToOneField': 'integer',
'PositiveIntegerField': 'integer UNSIGNED',
'PositiveSmallIntegerField': 'smallint UNSIGNED',
'SlugField': 'varchar(%(max_length)s)',
'SmallIntegerField': 'smallint',
*'TextField': 'longtext',
*'TimeField': 'time',
*'UUIDField': 'char(32)',
model数据约束
null 数据库中字段是否可以为空
db_column 数据库中字段的列名,别名
db_tablespace
default 数据库中字段的默认值
primary_key 数据库中字段是否为主键
db_index 数据库中字段是否可以建立索引
unique 数据库中字段是否可以建立唯一索引
unique_for_date 数据库中字段【日期】部分是否可以建立唯一索引
unique_for_month 数据库中字段【月】部分是否可以建立唯一索引
unique_for_year 数据库中字段【年】部分是否可以建立唯一索引
auto_now_add 该列自动填充系统当前时间(若不给它值,则自动填充)
查询条数
cut=models.UserInfo.objects.all().count()
return HttpResponse(str(cut))
第一条,字典
cut = models.UserInfo.objects.all().values().first()
print(cut)
转换为字典列表
cut=models.UserInfo.objects.all().values()
cut=list(cut)
print(cut)
关系查询
# 查询 id 大于 1 的
res=models.UserInfo.objects.filter(id__gt=1).values()
print(list(res))
# 获取id大于等于1的值
models.userinfo.objects.filter(id__gte=1)
# 获取id小于10的值
models.userinfo.objects.filter(id__lt=10)
# 获取id小于10的值
models.userinfo.objects.filter(id__lte=10)
# 获取id大于1 且 小于10的值
models.userinfo.objects.filter(id__lt=10, id__gt=1)
# 不等于
from django.db.models import Q
res=models.UserInfo.objects.filter(~Q(id=1)).values()
print(list(res))
in 和 not in
# 获取id等于11、22、33的数据
models.UserInfo.objects.filter(id__in=[11, 22, 33])
# not in
models.UserInfo.objects.exclude(id__in=[11, 22, 33])
is null
users=models.userinfo.objects.filter(id__isnull=False) #True
contains
users=models.userinfo.objects.filter(email__contains='admin')
#不区分大小写 icontains
users=models.userinfo.objects.filter(email__icontains='admin')
#不包含
users=models.userinfo.objects.exclude(email__icontains='admin')
这里的不区分大小写和sql语句的不区分大小写都与数据库的排序规则有关:
数据库中的排序规则用来定义字符在进行排序和比较的时候的一种规则。 常见的如下:
(1) utf8_general_cs 和 utf8_general_ci (后缀"_cs"或者"_ci"意思是区分大小写和不区分大小写(Case Sensitive & Case Insensitve))
(2) utf8_bin 规定每个字符串用二进制编码存储,区分大小写,可以直接存储二进制的内容
range: 两边都包含
users=models.userinfo.objects.filter(id__range=[3,7])
endswith startswith 以…开头,以…结尾
order_by()
res=models.UserInfo.objects.all().order_by('id') # asc
res=model.UserInfo.objects.all().order_by('-id') # desc
res=model.UserInfo.objects.all().order_by('-id','telephone') # 以id的desc,telephone的asc
group by
# select password,count(password) as count from UserInfo group by password
from django.db.models import Count,Min,Max,Sum
res=models.UserInfo.objects.values('password').annotate(count=Count('password'))
print(list(res))
# [{'password': '123456', 'count': 2}, {'password': 'qweqwe', 'count': 2}]
limit
models.Tb1.objects.all()[10:20]
regex正则匹配,iregex 不区分大小写
users=models.userinfo.objects.filter(email__regex=r'_admin')
res=models.UserInfo.objects.filter(email__regex=r'abc').values()
print(list(res))
# iregex 不区分大小写
res=models.UserInfo.objects.filter(email__iregex=r'abc').values()
print(list(res))
date
from datetime import datetime
models.UserInfo.objects.filter(pub_date__date=datetime.date(2005, 1, 1))
models.UserInfo.objects.filter(pub_date__date__gt=datetime.date(2005, 1, 1))
models.UserInfo.objects.filter(pub_date__year=2005)
models.UserInfo.objects.filter(pub_date__year__gte=2005)
原生sql
https://blog.csdn.net/DeskyAki/article/details/89070360
from django.db import connection, connections
cursor = connection.cursor() # cursor = connections['default'].cursor()
cursor.execute("SELECT * from user_UserInfo where id = {0}".format(1))
row = cursor.fetchall()
print(row)