• Django学习笔记(二)——django数据库的使用


    1.模型——SQLite3数据库使用

    使用django的数据库必须创建一个app

    python manage.py startapp check  创建app

    此时manage.py的目录下会多一个check的文件夹,里面有

    修改models.py文件

    from django.db import models
    
    # Create your models here.
    
    
    class usr(models.Model):
        usr = models.CharField(max_length=10)
        pwd = models.CharField(max_length=10)
    
    
    class access_key(models.Model):
        key = models.CharField(max_length=20)
        expires_time = models.DateTimeField()

    说明:usr为数据表名,usr,pwd为字段
    在setting.py文件中部分字段修改为:

    INSTALLED_APPS = (
    #     'django.contrib.admin',
    #     'django.contrib.auth',
    #     'django.contrib.contenttypes',
    #     'django.contrib.sessions',
    #     'django.contrib.messages',
    #     'django.contrib.staticfiles',
      
            "check",
    //在django的教程中,这里写的是mysite.check的,但是不知为什么我一直不行,最后只写check就成功了
    ) MIDDLEWARE_CLASSES
    = ( # 'django.contrib.sessions.middleware.SessionMiddleware', # 'django.middleware.common.CommonMiddleware', # 'django.middleware.csrf.CsrfViewMiddleware', # 'django.contrib.auth.middleware.AuthenticationMiddleware', # 'django.contrib.messages.middleware.MessageMiddleware', # 'django.middleware.clickjacking.XFrameOptionsMiddleware', )

    cmd中输入 python manage.py valible  检查有没有错

    python manage.py sqlall check 生成sql语句

    python manage.py syncdb  执行改成生成的语句

     如果执行以上语句,django不会自动添加表,可以通过以下代码来输出创建表的sql

    from django.db import connection
    from django.db.backends import creation
    from django.core.management.color import no_style
    T=Audit()
    c=creation.BaseDatabaseCreation(connection)
    print c.sql_create_model(T,no_style())[0][0]
    

      

    2.数据操作

    #插入数据
    def
    dbtestinsert(request): from check.models import usr u1=usr(usr='usr1',pwd="pwd1") u1.save() return HttpResponse("done") #查找数据
    def dbtestselect(request): from check.models import usr a=usr.objects.all() usr=a[0].usr #访问单个列
    b
    =usr.objects.filter(usr='usr1') #过滤,filter相当于sql语句中的where,返回一个列表
       c=usr.objects.get(urs='usr1') #get用于获取单个元组,即单行数据 d=usr.objects.order_by("name") #排序 d=usr.objects.order_by("-name") #倒序
      e=usr.objects.filter(name__contains="press")  #name__contains 相当于sql中的name like “%press%”
      f=usr.objects.order_by('name')[0:2]#相当于sql中的 limit 0,3
    return HttpResponse(str(a)+str(b))
    #更新数据
    def dbtestupdate(request):
       
    from check.models import usr
    #更新一条记录
        b=usr.objects.get(usr='usr1') #过滤,filter相当于sql语句中的where
        b.usr='usr2'
       b.save()
    #更新多条
      c=usr.objects.filter(pwd='pwd')
      c.update(pwd='pwd1')#update方法会返回影响的记录的条数,执行update后,修改已经commit了

    return
    HttpResponse("done")

    #删除数据
    u1=usr.objects.get(usr='luozixuan')
    u1.delete()

    #输出执行的SQL语句
    b=usr.objects.filter(usr='usr1')
    print b.query

     django默认会把a=usr.objects.all()方法获取的结果缓存起来,如果要获取最新的,需要调用方法

    usr.objects.update()

    3.模型进阶

    3.1访问多对多(sql中的连表查询)

    models.py

    class usr(models.Model):
        usr = models.CharField(max_length=10)
        pwd = models.CharField(max_length=10)
        def __unicode__(self):
            return str({"usr":self.usr,"pwd":self.pwd})
    
    class info(models.Model):
        myusr = models.ManyToManyField(usr)
        math = models.IntegerField(max_length=10)
        chinese = models.IntegerField(max_length=10)
        english = models.IntegerField(max_length=10)
        def __unicode__(self):
            return str({"usr":self.usr,"math":self.math,"chinese":self.chinese,"english":self.english})

    现在要实现sql的“select usr.usr,pwd,math,chinese,english from usr,info where usr.usr=info.usr where info.usr='lujianxai'"

    i=info.objects.get(usr='lujianxai')
    i.myusr.all()

    看来模型的连表查询的拓展性比较差,需要连表是,必须连表的一个字段的类型是ManyToManyField,从而连接到另一个表,但是在业务复杂的应用中,设计表时并不知道哪个字段是需要连表查的,所以到后期,业务拓展将十分困难,如果需要三表连表查询,那就更复杂了

    3.1添加或删除表的字段,需要先在django的models中修改class的定义,再到数据库客户端通过sql 的 alter table修改

    感觉这个也很麻烦。

    总结:

    好鸡肋的一个功能,django创建自己的数据库管理模块的目的就是统一管理数据库,不用每次运行sql语句时都要连接数据库,方便管理。但是使用数据库连接池PooledDB,就能很方便的管理数据库连接。

    而且django这样使用数据库就等于完全舍弃了成熟的,已经成为业界标准的sql语句,而使用自己设计的连接API,这样无疑增加了开发者的开发壁垒,从而增加开发的难度,也使代码的可读性降低了不少。

    -----------------

    20140418:后来查找了才知道django的这种管理数据库的模式叫ORM模式。

    相对于底层的数据库管理模式(connection和cursor),ORM模式对数据库的操作会更方便,需要写的代码会更少,可以快速进行数据的插入,更新,查询,删除等操作。但是ORM指适合操作数据较为简单的业务,对于连表查询,ORM表现得较为吃力。而且对于复杂一点的条件查询(如子查询,sql的exist等),ORM的表现也不尽人意,而且也实现不了sql count(*),sum,max等group功能。

    ORM的另一个确定是管理数据库较为麻烦,修改字段要修改model和取数据库客户端用sql语句修改。

  • 相关阅读:
    JSP 072: 处理注册结果样式的显示
    JSP 07: 开发注册页面
    JSP 06: 两个内置对象request和response
    Java Web 01: 什么是http协议
    JSP 05: JSP定义表达式和内容输出表达式
    JSP 04: 如何在JSP页面中书写Java代码
    JSP 03: 创建一个JSP页面并启动运行项目
    Fail 02: Port 8080 required by Tomcat Server at localhost is already in use.
    Fail 03: netstat 不是内部或外部命令
    Build 01: 安装新的JDK
  • 原文地址:https://www.cnblogs.com/Xjng/p/3557324.html
Copyright © 2020-2023  润新知