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 databaseprint queryset[5] # queries the database again然而,如果已经对全部查询集求值过,则将检查缓存:queryset=entry.objects.all()[entry for entry in queryset] # queries the databasesprint queryset[5] # uses cacheprint queryset[5] # uses cache下面是一些其他例子,他们会使得全部的查询集被求值并填充到缓存中:
[entry for entry in queryset]bool(queryset)entry in querysetlist(queryset)注:简单地打印查询集不会填充缓存.
queryresult=models.Article.objects.all()print(queryresult) # hits databaseprint(queryresult) # hits database
关于数据库创建表的两种方式:
1,code_first就是我们在django里面先把orm的创建数据库表的代码写出来然后进到terminal里面执行migrate命令操作就在数据库生成了表格
2,db_first就是在我们的数据库里面先用sql命令把数据库创建好,然后我们在django项目里面把settings文件里面所关联的数据库配置好,
在terminal里面执行
python manage.py inspectdb
得到效果如下图所示:这个命令就把我们数据库里面的所有表都生成了代码