zoukankan      html  css  js  c++  java
  • Django框架(九)—— 单表增删改查,在Python脚本中调用Django环境

    单表增删改查,在Python脚本中调用Django环境

    一、数据库连接配置

    • 如果连接的是pycharm默认的Sqlite,不用改动,使用默认配置即可

    • 如果连接mysql,需要在配置文件中的setting中进行配置:

      将DATABASES={} 更新为

    DATABASES = {
    	'default': {
    	'ENGINE': 'django.db.backends.mysql',
    	'HOST': '127.0.0.1',
    	'PORT': 3306,
    	'USER': 'root',
    	'PASSWORD': '123123',
    	'NAME': 'test_database',
    	}
    }
    

    同时还要在__init__.py文件中进行初始化设置:

    # 因为django默认链接mysql数据库,用的是MySQLdb模块,python3.0以后,不支持MySQLdb,需要用pymysql替换MySQLdb
    import pymysql
    pymysql.install_as_MySQLdb()
    

    配置完以后,要进行数据迁移(在pycharm的终端Terminal中运行指令),否则数据更新不能同步到mysql数据库中

    python manage.py makemigrations    ----记录数据库的变化,在migrations文件中可以看到记录
    python manage.py migrate           ----将变化同步到数据库中
    

    或者

    菜单 tools--->Run manage.py Task,即可进入manage.py,直接输入以下指令即可

    makemigrations    ----记录数据库的变化,在migrations文件中可以看到记录
    migrate           ----将变化同步到数据库中
    

    显示没有提交到数据库的数据

    python3 manage.py showmigrations  ---->查看那个没有提交到数据库
    

    二、orm创建表和字段

    1、orm的使用限制

    只能创建数据表和字段不能创建数据库(必须手动创建数据库)

    创建一个类就表示创建了一个数据表,类中的属性表示数据表中的字段

    创建表和字段在modules.py中

    类 --->  数据表
    属性 --->  字段
    

    2、orm创建表和字段

    在app的 models.py 中创建表

    # 类必须继承models.Model类,否则只表示一个普通的类
    # AutoField 自动增长的int类型
    # primary_key=True 该字段是主键
    # CharField(max_length=32) 表示 varchar(32)
    class User(models.Model):
        id = models.AutoField(primary_key=True)
        name = models.CharField(max_length=32)
        password = models.CharField(max_length=32)
        address = models.CharField(max_length=32)
    

    三、单表增删改查

    1、增加数据

    (1)方式一

    # 直接创建数据,返回值是一个对象
    book = models.Book.objects.create(name='西游记',price=50.5)
    print(book.name)
    

    (2)方式二

    # 先实例化产生对象,然后调用save方法,保存
    book = models.Book(name='西游记',price=70)
    book.save()
    print(book.name)
    

    2、删除数据

    (1)方式一

    返回值是影响的行数

    res = models.Book.objects.filter(name='西游记').delete()
    

    (2)方式二

    book = models.Book.objects.filter(name='西游记').first()
    book.delete()
    

    3、修改数据

    (1)方式一

    models.Book.objects.filter(name='西游记').update(name='红楼梦')
    

    (2)方式二

    对象没有update方法,可以利用对象获取它的属性,来修改数据,改完后要保存

    book = models.Book.objects.filter(name='西游记').first()
    book.name = '红楼梦'
    book.save()
    

    4、查询数据

    # 调用queryset对象的query可以查看对应的sql语句
    res = models.Book.objects.all()
    print(res.query)
    

    (1)查询数据API

    # 1. all():                  查询所有结果
      res = models.Book.objects.all()
    
    # 2. filter(**kwargs):       它包含了与所给筛选条件相匹配的对象,用逗号分隔,他们之间是and的关系
      res = models.Book.objects.filter(name='西游记',price='14')
    
    # 3. get(**kwargs):          返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。
      res = models.Book.objects.filter(id=1)
        
    # 4. exclude(**kwargs):      它包含了与所给筛选条件不匹配的对象,用逗号分隔,他们之间是and的关系
     res = models.Book.objects.exclude(name='西游记',price='23.8')
        
    # 5. order_by(*field):       对查询结果排序('-id'),字段名钱前加 “-” 表示从大到小排序
      res = models.Book.objects.all().order_by('price')
      res = models.Book.objects.all().order_by('-price')  
    
    # 6. reverse():              对查询结果反向排序,一定要先排序才能反向排序
      res = models.Book.objects.all().order_by('-price').reverse()
        
    # 7. count():                返回数据库中匹配查询(QuerySet)的对象数量。
      res = models.Book.objects.all().filter(name='西游记').count()
        
    # 8. first():                返回第一条记录
      res = models.Book.objects.all().first()
        
    # 9. last():                返回最后一条记录
      res = models.Book.objects.all().last()
        
    # 10. exists():              如果QuerySet包含数据,就返回True,否则返回False
     res = models.Book.objects.filter(name='三国演义').exists()
        
    # 11. values(*field):        返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列,model的实例化对象,而是一个可迭代的字典序列
     res = models.Book.objects.all().values('name','price') 
        # 返回值为QuerySet对象<{name='红楼梦',price=18},{name='西游记',price=58}>
        
    # 12. values_list(*field):   它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
      res = models.Book.objects.all().values_lists('name','price') 
        # 返回值为QuerySet对象<(name='红楼梦',price=18),(name='西游记',price=58)>
        
    # 13. distinct():            从返回结果中剔除重复纪录,只要带了id,去重就没有意义了
      res = models.Book.objects.all().values('name').distinct()
    

    (2)基于上下划线的模糊查询

    # 1. __in 字段的值在其中
    Book.objects.filter(price__in=[100,200,300])
    
    # 2. __gt 字段的值大于指定值
    Book.objects.filter(price__gt=100)
    
    # 3. __lt 字段的值小于指定值
    Book.objects.filter(price__lt=100)
    
    # 4. __gte 字段的值大于等于指定值
    Book.objects.filter(price__gte=100)
    
    # 5. __lte 字段的值小于等于指定值
    Book.objects.filter(price__lte=100)
    
    # 6. __range 字段的值在指定区间内,包含头和尾
    Book.objects.filter(price__range=[100,200])
    
    # 7. __contains 字段的值包含指定值,区分大小写
    Book.objects.filter(title__contains="python")
    
    # 8. __icontains 字段的值包含指定值,不区分大小写
    Book.objects.filter(title__icontains="python")
    
    # 9. __startswith 字段的值以指定值开头
    Book.objects.filter(title__startswith="py")
    
    # 10. __endswith 字段的值以指定值开头
    Book.objects.filter(title__startswith="on")
    
    # 11. __year 日期格式的年为指定值
    Book.objects.filter(pub_date__year=2012)
    

    四、在Python脚本中调用Django环境

    import os
    if __name__ == '__main__':
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "untitled15.settings")
        import django
        # 启动Django环境
        django.setup()
    
        from app01 import models
    
        books = models.Book.objects.all()
        print(books)
    
  • 相关阅读:
    集合异常原因与处理方式
    List的子类特点
    数据结构:数据的组织方式
    java对多态的了解
    JAVA电话本系统
    字符串转换数组
    登录用户名密码是否合法
    十三 spark 集群测试与基本命令
    十二 flume与kafka数据传输
    十一 spark- Standalone 集群
  • 原文地址:https://www.cnblogs.com/linagcheng/p/9947827.html
Copyright © 2011-2022 走看看