Django生成一个很有帮助的错误信息,大意是说没有正确设置数据库。

你可能会有疑惑,为什么在单元测试一切都运行ok,这是因为Django为单元测试创建了专用的测试数据库——这是Django中Testcase所做的神奇事情之一。

为了设置好真正的数据库,要创建一个数据库,SQlite数据库只是硬盘中的一个文件,在Django的setting.py文件中发现,默认情况下,Django把数据库保存为db.sqlite3,放在项目的基目录中

我们在Models.py文件和后来创建的迁移文件中告诉Django创建数据库所需的一切信息,为了创建真正的数据库,要使用Django中另一个强大manage.py命令——migrate

# python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, lists, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying lists.0001_initial... OK
Applying lists.0002_item_text... OK
Applying sessions.0001_initial... OK

这个时候,刷新localhost上的页面,发现错误页面不见了。然后运行功能测试:

AssertionError: '1: Buy peacock feathers' not found in ['1:Buy peacock feathers', '1:Buy peacock feathers']

快成功了,只需要让清单显示正确的序号即可,另一个出色的Django模板标签forloop.counter能帮助解决这个问题。

            {% for item in items %}
<tr><td>{{ forloop.counter }}: {{ item.text}}</td></tr>
{% endfor %}

再试一次,应该会看到功能测试运行到最后了:

    self.fail("完成测试")
AssertionError: 完成测试

不过运行测试时,可能会注意什么不对劲的地方

上一次运行测试时在数据库中遗留了数据。需要一种自动清理机制,可以手动清理,方法是先删除数据库在执行migrate命令新建。

# rm db.sqlite3
# python manage.py migrate --noinput Operations to perform:
  Apply all migrations: admin, auth, contenttypes, lists, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying lists.0001_initial... OK
  Applying lists.0002_item_text... OK
  Applying sessions.0001_initial... OK

清理之后要确保功能测试能通过。

除了这个小问题之外,我们的代码基本上可以正常运行了,下面做一次提交

# git status   # 看见home.html, tests.py, and views.py所做的改动
# git diff
# git add lists
# git commit -m "Redirect after POST, and show all items in template——发布后重定向,并显示模板中的所有项"
# git tag end-of-chapter-

小结:

  1. 编写一个表单,使用post请求把新待办事项添加到清单中;
  2. 创建了一个简单的数据库模型,用来存储待办事项;
  3. 使用了至少三种功能测试的调试技术

有用的概念:

  • 回归:新添加的代码破坏了应用原本可以正常使用的功能
  • 意外失败:意味着测试中有错误,或者测试帮我们发现了一个回归,因此要在代码中修正;
  • 遇红、变绿、重构:描述TDD流程的另一种方式;
  • 三角法:
  • 事不过三,三则重构
  • 记录编写代码过程中遇到的问题,等完成手里的工作后,回来再来解决。

Django学习系列18:使用迁移创建生产数据库的更多相关文章

  1. Django学习系列之Form基础

     Django学习系列之Form基础 2015-05-15 07:14:57 标签:form django 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追 ...

  2. django在admin后台注册自己创建的数据库表

    django在admin后台注册自己创建的数据库表,这样我们就可以在admin后台看到表结构信息,我们就可以在admin后台快速录入表记录信息 如果没有注册,那么你在登录django自带的admin的 ...

  3. Django学习系列14:第一个数据库迁移

    在Django中,ORM的任务是模型化数据库. 创建数据库其实是由另一个系统负责的叫做迁移. 迁移的任务是根据你对models.py文件的改动情况,添加或删除表和列. 可以把迁移想象成数据库使用的版本 ...

  4. django学习笔记【003】创建第一个带有model的app

    [1]python应用程序要连接mysql有多个驱动程序可供选择: 1.MySQLdb 这个只支持python2.x 所以在这里就不说了: 2.mysqlclient 下载地址 https://pyp ...

  5. Django学习系列6:使用selenium测试用户交互

    学习系列5中的单元测试有报错信息,这儿来编写functional_tests.py文件,扩充其中的功能测试 # File: functional_test.py # Author: Rxf # Cre ...

  6. Android学习系列(18)--App工程结构搭建

     本文算是一篇漫谈,谈一谈关于Android开发中工程初始化的时候如何在初期我们就能搭建一个好的架构.      关于android架构,因为手机的限制,目前我觉得也确实没什么大谈特谈的,但是从开发的 ...

  7. django学习笔记【004】创建带有model的app

    第一步:配置连接字符串 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'tempdb', 'HOST ...

  8. Django学习系列之Cookie、Session

    Cookie和Session介绍 cookie 保存在客户端 session 保存在服务端 session依赖于cookie,比如服务端想往客户端写东西的时候就把cookie写到客户端浏览器 djan ...

  9. Django学习系列19:完成最简单可用的网站——确保功能之间相互隔离

    前面遗留的问题,首先时功能测试运行结束后的清理:其次是目前我们的待办清单只允许创建一个大家公用的清单. 如何隔离测试,运行功能测试后待办事项一直存在于数据库中,这会影响下一次测试. 运行单元测试时,D ...

随机推荐

  1. IFC布局特点

    IFC(inline formatting context),行内格式化上下文 特点: 1.内联元素在水平线上一个接一个排列 2.内部元素水平方向上的margin.padding.border有效,垂 ...

  2. java中instanceof的基本使用

    java中的instanceof运算符是用于判断对象是否是指定类或这个指定类的子类的一个实例,返回值是布尔类型. 语法: boolean result = object instanceof clas ...

  3. Go语言集成开发工具JetBrains GoLandMac2.3中文版

    JetBrAIns GoLand  for Mac是是专为Go开发人员构建的跨平台IDE,功能非常强大拥有强大的代码洞察力,帮助所有Go开发人员即时错误检测和修复建议,快速和安全的重构,一步撤销,智能 ...

  4. CentOS7 中arp欺骗,如何让你玩游戏的室友早点睡觉?

    环境:CentOS7 Linux安装arpspoof进行arp攻击实验 arpspoof是dsniff的一个组件,主要用于进行arp欺骗使用,所以说我们需要安装dsniff,虽然有很多看起来很容易,但 ...

  5. sqlalchemy orm的cascade的参数

    #encoding: utf-8 from sqlalchemy import create_engine,Column,Integer,String,Float,func,and_,or_,Text ...

  6. failed to push some refs to 'git@github.com:cq1415583094/MyBatis.git'解决办法

    将本地git仓库代码提交到GitHub上时,出现failed to push some refs to 'git@github.com:cq1415583094/MyBatis.git', 导致的原因 ...

  7. Kick Start 2019 Round A Parcels

    题目大意 $R \times C$ 的网格,格子间的距离取曼哈顿距离.有些格子是邮局.现在可以把至多一个不是邮局的格子变成邮局,问每个格子到最近的邮局的曼哈顿距离的最大值最小是多少. 数据范围 $ 1 ...

  8. python-bioInfo-codes-2

    1. _tkinter.TclError: no display name and no $DISPLAY environment variable 解决方案: import matplotlibma ...

  9. typedef 定义结构体数组或其他数组

    typedef 定义结构体数组或其他数组 C\C++语言下 typedef其实是对一个变量类型的名字进行重新定义,例如下面中: typedef struct { int num[10]; char n ...

  10. bfs(太空电梯)

    http://oj.jxust.edu.cn/contest/problem?id=1563&pid=4 题目描述 公元9012年,Q博士发明了一部太空电梯,与一般电梯不同,太空电梯不能直接到 ...