Django框架补充之单表操作
单表操作
1 按步骤创建表
1.1 创建django项目,新建名为app01的app,在app01的models.py中创建模型
class Employee(models.Model): # 必须是models.Model的子类 id=models.AutoField(primary_key=True) name=models.CharField(max_length=16) gender=models.BooleanField(default=1) birth=models.DateField() department=models.CharField(max_length=30)
salary=models.DecimalField(max_digits=10,decimal_places=1)
1.2 django的orm支持多种数据库,如果想将上述模型转为mysql数据库中的表,需要settings.py
# 删除\注释掉原来的DATABASES配置项,新增下述配置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 使用mysql数据库 'NAME': 'db1', # 要连接的数据库 'USER': 'root', # 链接数据库的用于名 'PASSWORD': '', # 链接数据库的用于名 'HOST': '127.0.0.1', # mysql服务监听的ip 'PORT': 3306, # mysql服务监听的端口 'ATOMIC_REQUEST': True, #设置为True代表同一个http请求所对应的所有sql都放在一个事务中执行 #(要么所有都成功,要么所有都失败),这是全局性的配置,如果要对某个 #http请求放水(然后自定义事务),可以用non_atomic_requests修饰器 'OPTIONS': { "init_command": "SET storage_engine=INNODB", #设置创建表的存储引擎为INNODB } } }
1.4 其实python解释器在运行django程序时,django的orm底层操作数据库的python模块默认是mysqldb而非pymysql,然而对于解释器而言,python2.x解释器支持的操作数据库的模块是mysqldb,而python3.x解释器支持的操作数据库的模块则是pymysql,,毫无疑问,目前我们的django程序都是运行于python3.x解释器下,于是我们需要修改django的orm默认操作数据库的模块为pymysql
1.5 确保配置文件settings.py中的INSTALLED_APPS中添加我们创建的app名称,django2.x与django1.x处理添加方式不同
# django1.x版本,在下述列表中新增我们的app名字即可 INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01', # 'app02' # 若有新增的app,依次添加即可 ] # django2.x版本,可能会帮我们自动添加app,只是换了一种添加方式 INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01.apps.App01Config', # 如果默认已经添加了,则无需重复添加 # 'app02.apps.App02Config', # 若有新增的app,按照规律依次添加即可 ]
1.6 如果想打印orm转换过程中的sql,需要在settings中进行配置日志
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', }, }, 'loggers': { 'django.db.backends': { 'handlers': ['console'], 'propagate': True, 'level':'DEBUG', }, } }
1.7 最后在命令行中执行两条数据库迁移命令,即可在指定的数据库db1中创建表 :
$ python manage.py makemigrations $ python manage.py migrate # 注意: # 1、makemigrations只是生成一个数据库迁移记录的文件,而migrate才是将更改真正提交到数据库执行 # 2、数据库迁移记录的文件存放于app01下的migrations文件夹里 # 3、了解:使用命令python manage.py showmigrations可以查看没有执行migrate的文件
1.8 在表生成之后,如果需要增加、删除、修改表中字段,需要这么做
# 一:增加字段 #1.1、在模型类Employee里直接新增字段,强调:对于orm来说,新增的字段必须用default指定默认值 publish = models.CharField(max_length=12,default='人民出版社',null=True) #1.2、重新执行那两条数据库迁移命令 # 二:删除字段 #2.1 直接注释掉字段 #2.2 重新执行那两条数据库迁移命令 # 三:修改字段 #2.1 将模型类中字段修改 #2.2 重新执行那两条数据库迁移命令
2 添加记录
# 1、用模型类创建一个对象,一个对象对应数据库表中的一条记录 obj = Employee(name="Egon", gender=0, birth='1997-01-27', department="财务部", salary=100.1) # 2、调用对象下的save方法,即可以将一条记录插入数据库 obj.save()
3 查询记录
mysql> select * from app01_employee; +----+-------+--------+------------+------------+--------+ | id | name | gender | birth | department | salary | +----+-------+--------+------------+------------+--------+ | 1 | Egon | 0 | 1997-01-27 | 财务部 | 100.1 | | 2 | Kevin | 1 | 1998-02-27 | 技术部 | 10.1 | | 3 | Lili | 0 | 1990-02-27 | 运营部 | 20.1 | | 4 | Tom | 1 | 1991-02-27 | 运营部 | 30.1 | | 5 | Jack | 1 | 1992-02-27 | 技术部 | 11.2 | | 6 | Robin | 1 | 1988-02-27 | 技术部 | 200.3 | | 7 | Rose | 0 | 1989-02-27 | 财务部 | 35.1 | | 8 | Egon | 0 | 1997-01-27 | 财务部 | 100.1 | | 9 | Egon | 0 | 1997-01-27 | 财务部 | 100.1 | +----+-------+--------+------------+------------+--------+
4 修改记录
# 1、获取记录对象 obj=Employee.objects.filter(name='Egon')[0] # 2、修改记录对象属性的值 obj.name='EGON' obj.gender=1 # 3、重新保存 obj.save()
5 删除记录
5.1 直接删除单条记录
obj=Employee.objects.first()
obj.delete()
5.2 删除QuerySet中的所有记录对象
queryset_obj=Employee.objects.filter(id__gt=5)
rows=queryset_obj.delete()