51Testing软件测试论坛

标题: Django 数据库的操作 [打印本页]

作者: 测试积点老人    时间: 2019-1-2 14:46
标题: Django 数据库的操作
本帖最后由 测试积点老人 于 2019-1-2 14:49 编辑

Django 紧紧地遵循这种 MVC 模式,可以称得上是一种 MVC 框架。以下是 Django 中 M、V 和 C 各自的含义:



由于 C 由框架自行处理,而 Django 里更关注的是模型(Model)、模板(Template)和视图(Views),Django 也被称为 MTV 框架 。在 MTV 开发模式中:


models.py就是Django里面的建表所需的数据模型的描述:

命令:

python manage.py init 初始化数据库

python manage.py sqlall [appname] 查看app的CREATE TABLE的语句,包括原始数据,创建索引等.

python manage.py sqlreset [appname] 修改models,不保留以前数据,进行重置数据库,更新表。

python manage.py validate 用来排错

python manage.py syncdb 用来建表

python manage.py sql databasename 用来查看已创建数据库表结构


数据库建表过程:
1.创建应用程序
  1. python manage.py startapp appname
复制代码

2.用python代码写models.py,创建数据模型
  1. from django.db import models

  2. class Publisher(models.Model):
  3.     name = models.CharField(maxlength=30)
  4.     address = models.CharField(maxlength=50)
  5.     city = models.CharField(maxlength=60)
  6.     state_province = models.CharField(maxlength=30)
  7.     country = models.CharField(maxlength=50)
  8.     website = models.URLField()
复制代码
3.模型的安装
编辑settings.py
添加:
INSTALLED_APPS=(
        'mysite.appname',
}

4.创建数据库表:
python manage.py validate    (验证模型有效性)
python manage.py sqlall appname (生成CREATE TABLE语句)
python manage.py syncdb (执行上一步产生的SQL语句,简表。不执行上一句也可以建,也可以把上一句执行产生的SQL语句放入SQL客户端去执行,syncdb 仅仅创建数据库中不存在的表,而不会同步模型的修改或者删除到数据库)

5.插入和更新数据
插入数据:
定义对象
p = Publisher(.....)         //将新的内容放到Publisher里面赋给对象p
p.save()       //完成插入

上面相当于SQL语言:
  1. INSERT INTO book_publisher
  2.     (name, address, city, state_province, country, website)
  3. VALUES
  4.     ('Apress', '2855 Telegraph Ave.', 'Berkeley', 'CA',
  5.      'U.S.A.', 'http://www.apress.com/');
复制代码
更新数据:
p.name = 'NewName'        //修改对象p的名字
p.save()         //完成存储

上面相当于SQL语言:
  1. UPDATE book_publisher SET
  2.     name = 'NewName',
  3.     address = '2855 Telegraph Ave.',
  4.     city = 'Berkeley',
  5.     state_province = 'CA',
  6.     country = 'U.S.A.',
  7.     website = 'http://www.apress.com'
  8. WHERE id = 52;
复制代码
选择对象:
Publisher.objects.all()
相当于SQL:
  1. SELECT
  2.     id, name, address, city, state_province, country, website
  3. FROM book_publisher;
复制代码
数据过滤:
  1. Publisher.objects.filter(name="NewName")
  2. 相当于SQL语句:
  3. SELECT
  4.     id, name, address, city, state_province, country, website
  5. FROM book_publisher
  6. WHERE name = 'NewName';

  7. 缩小范围:
  8. Publisher.objects.filter(country="U.S.A.", state_province="CA")
  9. 相当于SQL语句:

  10. SELECT
  11.     id, name, address, city, state_province, country, website
  12. FROM book_publisher
  13. WHERE country = 'U.S.A.' AND state_province = 'CA';

  14. 模糊匹配:
  15. Publisher.objects.filter(name__contains="press")
复制代码

在 name 和 contains 之间有双下划线。象Python自己一样,Django也使用 双下划线来做一些小魔法,这个 __contains 部分会被Django转换成 LIKE SQL语句:

SELECT id, name, address, city, state_province, country, website FROM book_publisher WHERE name LIKE '%press%';

获取单个对象:
  1. Publisher.objects.get(name="Apress Publishing")数据排序:   Publisher.objects.order_by("name")
  2. 相当于SQL语句:
  3. SELECT
  4.     id, name, address, city, state_province, country, website
  5. FROM book_publisher
  6. ORDER BY name;

  7. 可以支持多个字段排序:
  8. Publisher.objects.order_by("state_provice", "address")

  9. 也可以逆向排序:
  10. Publisher.objects.order_by("-name") 添加‘-’同时排序和过滤:  Publisher.objects.filter(country="U.S.A.").order_by("-name")
  11. 相当于SQL语句:
  12. SELECT
  13.     id, name, address, city, state_province, country, website
  14. FROM book_publisher
  15. WHERE country = 'U.S.A'
  16. ORDER BY name DESC; 限制返回数据:  Publisher.objects.all()[Number]    //Number可以换成想要显示的位置下标
  17. 相当于SQL语句:
  18. SELECT
  19.     id, name, address, city, state_province, country, website
  20. FROM book_publisher
  21. ORDER BY name
  22. LIMIT 1; 删除对象:p = Publisher.objects.get(name="NewName")
  23. p.delete()
复制代码
修改数据库表结构:

添加字段:

首先,在开发环境中执行下面的步骤(也就是说,不是在发布服务器上):


删除字段:
  1. ALTER TABLE books_book DROP COLUMN test;删除表:DROP TABLE books_book
复制代码



作者: Miss_love    时间: 2020-12-28 09:21
学习了




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2