• day 67 orm初识 {code_first/db_first}


    1,我们是先创建一个django项目,要同时把app带上,

    然后再django项目里面把settings部分设置好,按照我们一开始创建django项目的时候设置的那些,csrf以及templates还有static里面的部分,

    然后我们在settings里面找到databases,把里面的跟数据库连接的配置参数都设置好,default里面的engine(在原基础上把最后一个参数改成mysql即可),name(数据库名),

    uuser(数据库用户名),password(数据库名对应的密码),host(数据库的ip地址,),port(数据库的端口)

    到这里我们的setting里面的数据库参数配置就完成了

    2.在我们的django里面,找到init文件在里面写上两句话,

    import pymysql  

    pymysql.install_as_MySQLdb()

    3.我们的orm是无法自己建库的,所以我们需要自己在命令行里面把库创建出来,仅仅是建库而已,

    我们要把库先建立出来

    4,再找到我们的App里面的models.py,我们在django里面运行这个程序它django本身就只是认识这个models而已,所以我们的数据库操作都要在这里执行,

    class User(models.Model):  # 这里的类名就是我们的数据库的名字
    id = models.AutoField(primary_key=True) # 这里是字段名自增id,主键设定
    name = models.CharField(max_length=30) # 字段名 varchar类型,最大长度是30

    5.在models里面找到terminal,然后执行两句话,

    python manage.py makemigrations   # 我们的改动操作都需要执行这一句,

    python manage.py migrate {我们这里的两句话执行是以类的形式去创建数据库里面的表格;类名对应的是数据库里面的表格,类的对象对应的是数据库里面的数据行,类的属性对应的是数据库里面的表格的字段}

    五步:
    1. 创建数据库
    2. 在app下的models.py里面创建model类,继承models.Model
    3. 在settings.py里面配置数据库连接信息
    4. 在项目(project)的__init__.py里面写上 import pymysql, pymysql.install_as_MySQLdb()
    5. 发命令:
    python manage.py makemigrations 收集变更
    python manage.py migrate 翻译成SQL语句,执行
    四部分:
    1. models.py
    2. Django
    3. pymysql
    4. MySQL


    ORM:
    类 ---> 数据表
    类的属性 ---> 数据列(表里的字段)
    对象 ---> 数据行

    补充一点注意事项:

    queryset

    可切片
    使用python的切片语法来限制查询集记录的数目,它等同于sql的limit和offset字句,切片在orm里面是不支持负的索引,例如(entry.objects.all()[-2]) 通常,查询集的切片返回一个新的查询集,它不会执行查询

    可迭代
    articlelist=models.Article.objects.all()
    for article in articlelist:
    print(article.title)

    惰性查询
    查询集是惰性执行的---创建查询集不会带来任何数据库的访问,你可以将过滤器保持一整天,直到查询集需要求值时,django才会指正运行这个查询
    queryresult=models.Article.objects.all()
    print(queryresult)
    for article in queryresult:
    print(article.title)
    一般来说只有在请求查询集的结果时才会到数据库中去获取它们,当你确实需要结果时,查询集通过访问数据库来值,关于求职发生的准确时间,

    缓存机制
    每个查询集都包含一个缓存来最小化对于数据库的访问,理解它是如何工作的将让你编写最高效的代码.
    在一个新创建的查询集中,缓存为空,首次对查询集进行求值--同时发生数据库查询--django将保存查询的结果到查询集中并返回明确请求的结果(例如,如果正在迭代查询集,则返回下一个结果)接下来对该查询集的求值将重用缓存的结果.
    请牢记这个缓存的行为,因为对查询集使用不当的话,效果会适得其反.例如,下面的语句创建两个查询集,对他们求值,然后扔掉它们:
    print([a.title for a in models.Article.objects.all()])
    print([a.create_time for a in models.Article.objects.all()])

    这意味着相同的数据库查询将执行两次,显然倍增了你的数据库负载,同时还有可能两个结果列表并不包含相同的数据库记录,因为在两次请求期间有可能有Article被添加进来或删除掉,为了避免这个问题,只需要保存查询集并重新使用它:
    queryresult=models.Article.objects.all()
    print([a.title for a in queryresult])
    print([a.create_time for a in queryresult])

    何时查询集不会被缓存?
    查询集不会永远缓存他们的结果,当只对查询集的部分进行求值时会检查会缓存,如果这个部分不在缓存中,那么接下来查询返回的记录都将不会被缓存,所以,这意味着使用切片或索引来限制查询集不会填充缓存.
    例如,重复获取查询集对象中一个特定的索引将每次都查询数据库:
    queryset=entry.objects.all()
    print queryset[5] # queries the database
    print queryset[5] # queries the database again
    然而,如果已经对全部查询集求值过,则将检查缓存:
    queryset=entry.objects.all()
    [entry for entry in queryset] # queries the databases
    print queryset[5] # uses cache
    print queryset[5] # uses cache

    下面是一些其他例子,他们会使得全部的查询集被求值并填充到缓存中:
    [entry for entry in queryset]
    bool(queryset)
    entry in queryset
    list(queryset)

    注:简单地打印查询集不会填充缓存.
    queryresult=models.Article.objects.all()
    print(queryresult) # hits database
    print(queryresult) # hits database

    关于数据库创建表的两种方式:

    1,code_first就是我们在django里面先把orm的创建数据库表的代码写出来然后进到terminal里面执行migrate命令操作就在数据库生成了表格

    2,db_first就是在我们的数据库里面先用sql命令把数据库创建好,然后我们在django项目里面把settings文件里面所关联的数据库配置好,

    在terminal里面执行

    python manage.py inspectdb

    得到效果如下图所示:这个命令就把我们数据库里面的所有表都生成了代码

  • 相关阅读:
    《构建之法》阅读笔记4
    团队冲刺第七天
    团队冲刺第六天
    团队冲刺第五天
    团队冲刺第四天
    团队冲刺第三天
    构建之法阅读笔记03
    第十四周进度条
    第二阶段冲刺站立会议10
    第二阶段冲刺站立会议09
  • 原文地址:https://www.cnblogs.com/2012-dream/p/8315866.html
Copyright © 2020-2023  润新知