文章目录
一、ORM创建表结构
通过以下6步,可以创建一个空表(只有定义好的列,没有数据)
1、创建数据库
因为Django无法创建数据库,所以需要在外面创建数据库;
2、修改Django默认数据库
在Django项目的全局配置setting
中修改默认数据库(默认是SQLlite);
# 默认
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
修改为MySQL(第三方数据库):
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME':'s4day70db',
'USER': 'root',
'PASSWORD': '',
'HOST': 'localhost',
'PORT': 3306,
}
}
3、修改Django默认用来连接数据库的工具
在全局的初始化文件init.py
中添加两行(Django默认使用MySQLdb连接,现改用第三方工具pymysql)
import pymysql
pymysql.install_as_MySQLdb()
4、创建表和列
在对应的App文件夹下的models.py中写ORM语句
from django.db import models
class UserInfo(models.Model):
“”“
类名即表名。需要注意的是,ORM类需要继承自`models.Model`
通过调用models的方法创建列(字段)
”“”
nid = models.BigAutoField(primary_key=True)
user = models.CharField(max_length=32)
password = models.CharField(max_length=64)
age = models.IntegerField(default=1)
# 这里的字段名虽然是ug,创建表后自动改成ug_id
# 同时,外键关联的是整个UserGroup表,而不是其中一列,所以ug指向一张表
ug = models.ForeignKey("UserGroup",null=True)
5、注册App
在全局设置setting
中找到INSTALLED APP,并添加新增的App
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
添加后:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01',
]
6、创建数据表
终端执行。命令执行完后会在对应的App文件夹下生成一个migrations子目录,其中的文件为ORM操作日志。
python manage.py makemigrations # 转换成SQL语句
python manage.py migrate # 执行SQL语句
二、ORM操作表数据
from app01 import models
1、增删查改
a)增
models.表名.objects.create(field1='XXX', field2='XXX', ...)
#注意,对于外键,这里使用的是ug_id,而不是ug(创建时的字段名)
models.UserInfo.objects.create(user='root',password='pwd',age=18,ug_id=1)
b)删
models.表名.objects.filter(筛选条件).delete()
models.UserGroup.objects.filter(id=2).delete()
c)查
# 获取单条数据,不存在则报错(不建议)
group_list = models.Tb1.objects.get(id=123)
# 获取指定条件的数据
group_list = models.UserGroup.objects.filter(id=1)
# 获取全部
group_list = models.UserGroup.objects.all()
# 获取全部的指定列
group_list = models.UserGroup.objects.all().values('field1', 'field2', ...)
# 获取指定列时,可以通过外键进行跨表指定,但需要使用双下划线
group_list = models.UserGroup.objects.all().values('field1', 'ug__title', ...)
d)改
models.表名.objects.filter(筛选条件).update(修改内容)
models.UserGroup.objects.filter(id=2).update(title='公关部')
2、筛选查找
a) 大于、小于 field__gt/lt
models.Tb1.objects.filter(id__gt=1) # 获取id大于1的值
models.Tb1.objects.filter(id__lt=10) # 获取id小于10的值
models.Tb1.objects.filter(id__gte=1) # 获取id大于等于1的值
models.Tb1.objects.filter(id__lte=10) # 获取id小于10的值
models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1且小于10的值
b) AND 和 OR
# AND
models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1且小于10的值
# OR
from django.db.models import Q
models.Tb1.objects.filter(Q(id__lt=10) | Q(id__gt=1))
c) field__in
models.Tb1.objects.filter(id__in=[11, 22, 33]) # 获取id等于11、22、33的数据
models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in
d) field__range
models.Tb1.objects.filter(id__range=[1, 2]) # 范围bettwen and
e) field__contains
models.Tb1.objects.filter(name__contains="ven")
models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感
models.Tb1.objects.exclude(name__icontains="ven")
f) field__isnull
Entry.objects.filter(pub_date__isnull=True)
g) limit
models.Tb1.objects.all()[10:20]
h) 正则
Entry.objects.get(title__regex=r'^(An?|The) +')
Entry.objects.get(title__iregex=r'^(an?|the) +') # 不区分大小写
3、排序
models.Tb1.objects.filter(name='seven').order_by('id') # asc
models.Tb1.objects.filter(name='seven').order_by('-id') # desc
4、分组
from django.db.models import Count, Min, Max, Sum
models.Tb1.objects.filter(c1=1).values('id').annotate(c=Count('num'))
# SELECT "app01_tb1"."id", COUNT("app01_tb1"."num") AS "c"
FROM "app01_tb1"
WHERE "app01_tb1"."c1" = 1
GROUP BY "app01_tb1"."id"
5、ORM语句表达不出,就写原生SQL语句
from django.db import connection, connections
# 使用默认的数据库,等价于cursor = connections['default'].cursor()
# 在全局设置的setting中的DATABASES中可设置,default可换
cursor = connection.cursor()
cursor.execute("""SELECT * from auth_user where id = %s""", [1])
row = cursor.fetchone()