单表操做1

建立表

1 建立模型

建立名为book的app,在book下的models.py中建立模型:python

from django.db import models

# Create your models here.
class Book(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=64)
    pub_data = models.DateField()
    price = models.DecimalField(max_digits=5, decimal_places=2)
    publish = models.CharField(max_length=12)
    def __str__(self):
        return self.name

2 settings配置

若想将模型转为mysql数据库中的表,须要再setting中配置:mysql

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'lqz',
        'USER': 'root',
        'PASSWORD': '123456',
        'HOST': '127.0.0.1',
        'PORT': 3306,
        'ATOMIC_REQUEST': True,
        'OPTIONS': {
            "init_command": "SET storage_engine=MyISAM",
        }
    }
}
'''
'NAME':要链接的数据库,链接前须要建立好
'USER':链接数据库的用户名
'PASSWORD':链接数据库的密码
'HOST':链接主机,默认本机
'PORT':端口 默认3306
'ATOMIC_REQUEST': True,
设置为True统一个http请求对应的全部sql都放在一个事务中执行(要么全部都成功,要么全部都失败)。
是全局性的配置, 若是要对某个http请求放水(而后自定义事务),能够用non_atomic_requests修饰器 
'OPTIONS': {
             "init_command": "SET storage_engine=MyISAM",
            }
设置建立表的存储引擎为MyISAM,INNODB

注意1:NAME即数据库的名字,在mysql链接前该数据库必须已经建立,而上面的sqlite数据库下的db.sqlite3则是项目自动建立 USER和PASSWORD分别是数据库的用户名和密码。设置完后,再启动咱们的Django项目前,咱们须要激活咱们的mysql。而后,启动项目,会报错:no module named MySQLdb 。这是由于django默认你导入的驱动是MySQLdb,但是MySQLdb 对于py3有很大问题,因此咱们须要的驱动是PyMySQL 因此,咱们只须要找到项目名文件下的__init__,在里面写入:

import pymysql
pymysql.install_as_MySQLdb()

最后经过两条数据库迁移命令便可在指定的数据库中建立表 :git

python manage.py makemigrations
python manage.py migrate

注意2:确保配置文件中的INSTALLED_APPS中写入咱们建立的app名称

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    "book"
]

注意3 :若是想打印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',
        },
    }
}

3 增长,删除字段

删除,直接注释掉字段,执行数据库迁移命令便可sql

新增字段,在类里直接新增字段,直接执行数据库迁移命令会提示输入默认值,此时须要设置数据库

publish = models.CharField(max_length=12,default='人民出版社',null=True)

注意:

 1 数据库迁移记录都在 app01下的migrations里django

  2 使用showmigrations命令能够查看没有执行migrate的文件session

  3 makemigrations是生成一个文件,migrate是将更改提交到数据量app

添加表记录

方式1

# create方法的返回值book_obj就是插入book表中的python葵花宝典这本书籍纪录对象
book_obj=Book.objects.create(title="python葵花宝典",state=True,price=100,publish="苹果出版社",pub_date="2012-12-12")

方式2

book_obj=Book(title="python葵花宝典",state=True,price=100,publish="苹果出版社",pub_date="2012-12-12")
book_obj.save()

查询表记录

<1> all():                  查询全部结果
  
<2> filter(**kwargs):       它包含了与所给筛选条件相匹配的对象
  
<3> get(**kwargs):          返回与所给筛选条件相匹配的对象,返回结果有且只有一个,若是符合筛选条件的对象超过一个或者没有都会抛出错误。
  
<4> exclude(**kwargs):      它包含了与所给筛选条件不匹配的对象
 
<5> order_by(*field):       对查询结果排序('-id')
  
<6> reverse():              对查询结果反向排序
  
<8> count():                返回数据库中匹配查询(QuerySet)的对象数量。
  
<9> first():                返回第一条记录
  
<10> last():                返回最后一条记录
  
<11> exists():              若是QuerySet包含数据,就返回True,不然返回False
 
<12> values(*field):        返回一个ValueQuerySet——一个特殊的QuerySet,运行后获得的并非一系列
                            model的实例化对象,而是一个可迭代的字典序列
<13> values_list(*field):   它与values()很是类似,它返回的是一个元组序列,values返回的是一个字典序列
 
<14> distinct():            从返回结果中剔除重复纪录

基于双下划线的模糊查询

Book.objects.filter(price__in=[100,200,300])
Book.objects.filter(price__gt=100)
Book.objects.filter(price__lt=100)
Book.objects.filter(price__gte=100)
Book.objects.filter(price__lte=100)
Book.objects.filter(price__range=[100,200])
Book.objects.filter(title__contains="python")
Book.objects.filter(title__icontains="python")
Book.objects.filter(title__startswith="py")
Book.objects.filter(pub_date__year=2012)

删除表记录

删除方法就是 delete()。它运行时当即删除对象而不返回任何值。例如:atom

model_obj.delete()

你也能够一次性删除多个对象。每一个 QuerySet 都有一个 delete() 方法,它一次性删除 QuerySet 中全部的对象。code

例如,下面的代码将删除 pub_date 是2005年的 Entry 对象:

Entry.objects.filter(pub_date__year=2005).delete()

在 Django 删除对象时,会模仿 SQL 约束 ON DELETE CASCADE 的行为,换句话说,删除一个对象时也会删除与它相关联的外键对象。例如:

b = Blog.objects.get(pk=1)
# This will delete the Blog and all of its Entry objects.
b.delete()

要注意的是: delete() 方法是 QuerySet 上的方法,但并不适用于 Manager 自己。这是一种保护机制,是为了不意外地调用 Entry.objects.delete() 方法致使 全部的 记录被误删除。若是你确认要删除全部的对象,那么你必须显式地调用:

Entry.objects.all().delete() 

若是不想级联删除,能够设置为:

pubHouse = models.ForeignKey(to='Publisher', on_delete=models.SET_NULL, blank=True, null=True)

修改表记录

Book.objects.filter(title__startswith="py").update(price=120

此外,update()方法对于任何结果集(QuerySet)均有效,这意味着你能够同时更新多条记录update()方法会返回一个整型数值,表示受影响的记录条数。

三 在Python脚本中调用Django环境

import os
if __name__ == '__main__':
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "untitled15.settings")
    import django
    django.setup()

    from app01 import models

    books = models.Book.objects.all()
    print(books)

四,Django终端打印SQL语句

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console':{
            'level':'DEBUG',
            'class':'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'propagate': True,
            'level':'DEBUG',
        },
    }
}
相关文章
相关标签/搜索