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. JavaScript面向对象当中的几个概念

    JS面向对象过程中的几个概念 前言 面向对象描述的是一种代码组织解构的形式,一种在软件中对真实世界中问题领域的建模方法. 下面将从理论层面来介绍下面向对象编程中一些常见的概念. 对象 所谓对象,本质上 ...

  2. Tensorflow 从文件中载入训练数据

    本节包含: 用纯文本文件准备训练数据 加载文件中的训练数据 一.用纯文本文件准备训练数据 1.数据的数字化 比如,“是” —— “1”,“否” —— “0” “优”,“中”,“差” —— 1 2 3  ...

  3. C#与Unity 数据存储

    使用Json存储数据 1.创建Json文件,直接创建txt文件,将后缀名改为xx.json 2.Json文件的数据格式,中括号表示列表,即中括号下的每个逗号隔开的内容都是列表的每个元素,花括号表示对象 ...

  4. linux centos 安装输入法

    终端输入命令: yum install ibus-libpinyin.x86_64

  5. webdriervAPI(键盘事件)

    from  selenium  import  webdriver from selenium.webdriver.common.keys import Keys   #导入键盘操作事件 driver ...

  6. python 连接SQL SERVER 并读取其数据

    1.没什么难的操作 安装  pip install pymssql import pymssql #引入pymssql模块 import pandas as pd def conn(): connec ...

  7. 【Python开发】Python 适合大数据量的处理吗?

    Python 适合大数据量的处理吗? python 能处理数据库中百万行级的数据吗? 处理大规模数据时有那些常用的python库,他们有什么优缺点?适用范围如何? 需要澄清两点之后才可以比较全面的看这 ...

  8. dll的封装和使用

    背景 在windows平台下,要实现函数的封装,一般采用的是dll动态库的形式 实现了函数的封装就意味着实现过程的隐藏 可以实现跨平台和跨语言的使用 实施步骤 生成dll动态库 在VS中生成新项目,应 ...

  9. DIN

    1. DIN(Deep Interest Network)优点 使用用户兴趣分布来表示用户多种多样的兴趣爱好. 使用Attention机制来实现Local Activation,局部激活相关的历史兴趣 ...

  10. Nginx linux下的安装

    1.先把从官网 nginx.io下载 的安装包通过ftp传到服务器上,然后进行解压. 我的安装环境以及nginx版本 :Ubuntu16 ,nginx-1.11.3.tar.gz(经过这个尝试这个版本 ...